如何格式化需要两个标记相等的语法规则?

时间:2013-04-07 00:38:51

标签: parsing yacc

如何编写与两个令牌匹配的Yacc语法?例如:

START some_random_id
stuff stuff stuff
END some_random_id

我想要求some_random_id在两个地方匹配以匹配整个块。所以它会是这样的:

block <- START ID block_body END ID

另外要求两个ID相等。

1 个答案:

答案 0 :(得分:3)

只要从一组任意大小中提取some_random_id,就不可能单独使用语法规则。有一个经典的数学证明。您只能使用解析器操作代码来检查id是否相同。但这不是很难。将yylval联合定义为具有由扫描程序填充的字段id_string。然后你会有类似的东西:

%union {
  char *id_string;
  ...
} 
%token <id_string> ID KW_START KW_END 
%%
...
block : KW_START ID stuff KW_END ID  { 
    if (strcmp($2.id_string, $5.id_string) != 0) YYERROR; }