flex bison用于解析块

时间:2016-02-10 08:25:25

标签: file parsing bison flex-lexer

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来帮助我。

很长一段时间我都遇到了这个问题。请帮帮我。

非常感谢你。

1 个答案:

答案 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语法指定语法。这会减少一些努力。