yacc / lex的基本问题

时间:2010-07-27 13:45:20

标签: parsing yacc lexer

我在一个非常简单的yacc / lex程序中遇到了一些问题。我可能忘记了一些基本步骤(自从我使用这些工具以来已经很长时间了。)

在我的lex程序中,我提供了一些基本值,如:

word    [a-zA-Z][a-zA-Z]*
%%
":"    return(PV);
{word}  { 
            yylval = yytext;
            printf("yylval = %s\n",yylval);
            return(WORD);
       }
"\n"    return(ENDLINE);

在我的yacc程序中,我的语法的开头是(其中TranslationUnit是我的%start):

TranslationUnit:
               /* Nothing */
              | InfoBlock Data
              ;

InfoBlock:
           /* Nothing */
         | InfoBlock InfoExpression {}
         ;

InfoExpression:
             WORD PV WORD ENDLINE { printf("$1 = %s\n",$1);
 printf("$2 = %s\n",$2);
 printf("$3 = %s\n",$3);
 printf("$4 = %s\n",$4);
                                  }
            | ... /* other things */
            ;

Data:
    ... /* other things */

当我使用输入运行我的程序时:

keyword : value

我以为我至少会得到:

$1 = keyword
$2 = keyword // yylval not changed for token PV
$3 = value
$4 = value // yylval not changed for token ENDLINE

其实我得到了:

$1 = keyword : value
$2 = keyword : value
$3 = value
$4 = value

我不明白这个结果。我前段时间学过语法,即使我现在不记得所有内容,我也没有看到任何重要的错误......

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

麻烦的是,除非您保存令牌,否则Lex / Yacc会继续覆盖空间,或指向不同的空间等。因此,您需要在修改之前隐藏对您至关重要的信息。您在Lex代码中的打印应该向您显示调用词法分析器(词法分析器)时yylval值是准确的。

另见SO 2696470遇到并诊断出相同的基本问题。