如何编写匹配两个标记的 Yacc 语法?例如:
START some_random_id
stuff stuff stuff
END some_random_id
我想要求 some_random_id 在两个地方都匹配以匹配整个块。所以它会是这样的:
block <- START ID block_body END ID
附加要求两个 ID 相等。
只要some_random_id
是从任意大小的集合中提取的,这仅与语法规则无关。有一个经典的数学证明。您只能使用检查id
s 是否相同的解析器操作代码来执行此操作。但这并不是很难。将联合定义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; }