有人可以帮我理解如何为C程序编码lex和yacc文件来解析goto和block(标签)。
以下是我在网上找到的一些例子:
<statement> ::=
<variable> <inc> <semi>
| <variable> <assign> <null> <semi>
| <goto> <label> <semi>
但如何唯一识别标签。有人可以给我一个这方面的例子或提到它的任何链接。
答案 0 :(得分:1)
<label>
这里的确意味着一个符号 - 一个标识符 - 必须与其他地方的标签定义相对应才能使程序正确。
答案 1 :(得分:0)
您不需要“唯一标识”作为解析器的一部分,标签由语言的语法标识。允许标签与其他符号/变量名称重叠是完全合法的。只需为合法标签添加规则,为IDENTIFIER重用词法分析器TOKEN,然后在每个函数的符号表中存储标签,以便检测重复的标签。
通常,在类C语言中,标签是声明规则的一部分。它在其他任何地方通常都没有意义。我这样做的方式:
labeled_statement:
IDENTIFIER ':' statement
{
$$ = $3;
$$->label = new Label($1);
}
;
另一种方式:
label:
IDENTIFIER ':'
{ $$ = new Label($1); }
;
labeled_statement:
label statement
{
$$ = $2;
$$->label = $1;
}
;