用于解析块的 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 语法来指定语法。那会减少一些努力。
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 语法来指定语法。那会减少一些努力。