0

我有一些令人困惑的问题让我陷入循环,请帮助我理解它们。

  1. 如果我有两个文件,一个是.y解析器文件,第二个是.l词法分析器,我可以yytext在解析器文件中使用,我应该定义yylex那里使用它吗?

  2. 如果我想更改默认yyerror函数,我应该在声明部分的解析器文件中声明它吗?

  3. 如果在 lex 文件中,我向解析器返回一个令牌,如下所示:

    [0-9] 返回数字;什么是传递给解析器的 DIGIT 找到的数字或只是没有 DIGIT 的数字本身?

  4. 我如何yylineno在解析器文件中使用,因为我需要解析器使用yylineno并告诉错误发生在哪里以及是什么令牌导致的?

  5. 当我编写这样的规则时,在解析器文件中:

    exp -> exp |//

是一样的吗

exp ->/*empty*/ |exp 

我感谢任何可以帮助我解决这些问题的人,因为他们让我感到困惑,在此先感谢

4

1 回答 1

1
  1. yytext在文件中使用.y是危险且容易出错的——它没有很好地定义yytext是数组还是指针,而且它甚至可能在文件外部不可见.l

  2. liby.a 中定义了一个yyerror函数——如果你链接到-ly它,你就可以使用它。如果你想定义你自己的yyerror,你可以在任何地方这样做。

  3. return DIGIT;DIGIT作为标记返回(大概是.y文件中定义的标记%token,与实际数字值无关。如果要在解析器中访问数字值,则需要在词法分析器中将其从yytextto复制:yylval

    [0-9]        { yylval = *yytext-'0'; return DIGIT; }
    
  4. yylineno,如果它存在(需要正确的 flex 选项来自动创建它)通常只是一个全局变量。您需要小心,因为解析器可能会在减少规则之前预先读取一个标记,因此yylineno可能会因该标记而偏离您真正想要的。如果您使用的是野牛,您可以在重新运行每个标记之前将您的词法分析器复制yylinenoyylloc其中,这将允许您为解析器中的每个标记获取正确的行号。

  5. 以下都是相同的:

    exp: exp | /*empty */ ;
    


    exp: /*empty*/ | exp ;
    


    exp: /*empty*/ ;
    exp: exp ;
    

通常,文件中规则的顺序.y无关紧要(它影响减少/减少冲突的解决,但没有其他影响)。

请注意,具有exp -> exp自动使您的语法模棱两可的规则并导致移位/减少冲突。

于 2012-12-11T04:05:15.763 回答