1

如何编写匹配两个标记的 Yacc 语法?例如:

START some_random_id
stuff stuff stuff
END some_random_id

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

block <- START ID block_body END ID

附加要求两个 ID 相等。

4

1 回答 1

3

只要some_random_id是从任意大小的集合中提取的,这仅与语法规则无关。有一个经典的数学证明。您只能使用检查ids 是否相同的解析器操作代码来执行此操作。但这并不是很难。将联合定义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; }
于 2013-04-07T00:56:21.563 回答