BEGIN BLOCK BLK_ROWDEC
NAME cell_rowdec
SIZE UNI_rowdecSize
ITERATE itr_rows
DIRECTION lgDir_rowdec
STRAP STRD1,STRD3,STRD2
WRAP WRD1
VIA VIAB,VIAC,VIAD
ENDS BLK_ROWDEC
我想使用flex和bison解析它,使其匹配BEGIN和ENDS的块名称。并且它发现两者相等然后才解析。那么如何通过flex和bison来帮助我。
很长一段时间我都遇到了这个问题。请帮帮我。
非常感谢你。
答案 0 :(得分:1)
如果我理解正确,那就是有关名字的开头/结尾对。
如果你有一个无上下文语法,你就会有匹配的开始/结束对,比如
text := block
| text block
;
block := BEGIN BLOCK blockname blockcontents ENDS blockname
;
blockcontents := item
| blockcontents item
;
item := block
| VIA vialist
| WRAP wrapname
...
现在,如果您查看块的生成,您会注意到名称出现两次。在您的行动中,您可以检查平等。如果两个名称相同,那么很好,如果没有,则会出现语法错误。自打开“BEGIN BLOCK”以来忽略所有内容是应对语法错误的一种策略。 (如果我没有弄错,名称必须匹配的条件使得语法不是上下文,但由于条件非常简单,我将其归类为“几乎无上下文”;)
如果你的文本允许混合多个块,你的语法不是无上下文的,而且解析起来要困难得多(尽管并非不可能)。 你仍然可以使用lex / yacc resp。 flex / bison,但它需要更多的簿记。
但是,你需要的第一件事就是语法。我上面的(部分)示例可能是一个开始。 您可以使用bison / yacc语法指定语法。这会减少一些努力。