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

Parsing 如何格式化要求两个标记相等的语法规则?,parsing,yacc,Parsing,Yacc,如何编写匹配两个标记的Yacc语法?例如: START some_random_id stuff stuff stuff END some_random_id 我想要求some_random_id在两个位置匹配,以匹配整个块。所以它会是这样的: block <- START ID block_body END ID %union { char *id_string; ... } %token <id_string> ID KW_START KW_END %% .

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

START some_random_id
stuff stuff stuff
END some_random_id
我想要求some_random_id在两个位置匹配,以匹配整个块。所以它会是这样的:

block <- START ID block_body END ID
%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; }

block只要从任意大小的集合中提取
一些随机id
,这就不可能单独使用语法规则。这有一个经典的数学证明。您只能使用检查
id
s是否相同的解析器操作代码来执行此操作。但这并不难。定义
yylval
联合,使其具有由扫描仪填写的字段
id\u字符串
。然后你会有这样的东西:

block <- START ID block_body END ID
%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; }
%union{
字符*id_字符串;
...
} 
%令牌ID KW\u开始KW\u结束
%%
...
块:KW_开始ID填充KW_结束ID{
if(strcmp($2.id\u string,$5.id\u string)!=0)YYERROR;}

+1我们应该合并我们的答案。我相信我们是在说同样的话(信息)。谢谢。感谢你们两位,我将添加你们的工会声明(除了你们忘了%;-)。我实际上并没有使用yacc,而是使用ply(Python的yacc)。我基本上和你们建议的一样。