如何编写与两个令牌匹配的Yacc语法?例如:
START some_random_id
stuff stuff stuff
END some_random_id
我想要求some_random_id在两个地方匹配以匹配整个块。所以它会是这样的:
block <- START ID block_body END ID
另外要求两个ID相等。
答案 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; }