用于解析块的 flex bison

flex bison for parsing block

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怎么可能请帮帮我。

长期以来我一直被这个问题困扰。请帮助我。

非常感谢。

如果我没理解错的话,就是 begin/end 对的名字。

如果您有上下文无关语法,您将有 begin/end 对匹配,例如

text := block
     |  text block
     ;

block := BEGIN BLOCK blockname blockcontents ENDS blockname
     ;

blockcontents := item
     |           blockcontents item
     ;

item := block
     |  VIA vialist
     |  WRAP wrapname
     ...

现在,如果您查看块的生成,您会注意到该名称出现了两次。在您的操作中,您可以检查是否相等。如果两个名称相等,那很好,如果不相等,则存在语法错误。忽略开头 "BEGIN BLOCK" 之后的所有内容是处理语法错误的一种策略。 (如果我没记错的话,名称必须匹配的条件使语法不是上下文无关的,但由于条件非常简单,我将其归类为 "almost context free" ;)

如果您的文本允许混合使用多个块,则您的语法不是上下文无关的,并且更难解析(尽管并非不可能)。 您仍然可以使用 lex/yacc resp。 flex/bison,但您需要做更多的簿记工作。

不过,您首先需要的是语法。我上面的(部分)示例可能是一个开始。 您可以使用 bison/yacc 语法来指定语法。那会减少一些努力。