编译器设计代码来解析goto和块

时间:2014-10-15 16:03:34

标签: c compiler-construction yacc lex goto

有人可以帮我理解如何为C程序编码lex和yacc文件来解析goto和block(标签)。

以下是我在网上找到的一些例子:

<statement> ::= 
<variable> <inc> <semi>
| <variable> <assign> <null> <semi> 
| <goto> <label> <semi>

但如何唯一识别标签。有人可以给我一个这方面的例子或提到它的任何链接。

2 个答案:

答案 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;
    }
    ;