处理字符串时解析错误

时间:2016-04-14 15:57:13

标签: c string yacc lex

%option case-insensitive
%option noyywrap
%option yylineno


id              [a-zA-Z][a-zA-Z_0-9]*

integer         (0[xX][0-9A-Fa-f]+)|([0-9]+)

real            [0-9]*\.[0-9](e|E)?[0-9]*

undefined       [^"\r\n \t]

%x STR
%%
\" string_buf_ptr = string_buf; BEGIN(STR);

<STR>\"        { /* saw closing quote - all done */
    BEGIN(INITIAL);
    *string_buf_ptr = '\0';
    /* return string constant token type and
     * value to parser
     */

     yylval.strVal = strdup(string_buf);
     sprintf(yyout, yylval.strVal);
     return STR;
    }

<STR>\\n  *string_buf_ptr++ = '\n';
<STR>\\t  *string_buf_ptr++ = '\t';
<STR>\\r  *string_buf_ptr++ = '\r';
<STR>\\b  *string_buf_ptr++ = '\b';
<STR>\\f  *string_buf_ptr++ = '\f';

<STR>\\(.|\n)  *string_buf_ptr++ = yytext[1];

<STR>[^\\\n\"]+        {
    char *yptr = yytext;

    while ( *yptr )
            *string_buf_ptr++ = *yptr++;
    }

这是我的字符串词法分析代码的一部分。此代码的目标是定位字符串(类似于C的字符串ex。"Hello World")并将它们返回给我们的解析器进行处理。

我还使用Yacc工具构建了一个解析器,它几乎是完美的,除非我们将字符串赋给变量(例如x="Hello World";) 当我这样做时,调用yyerror(const char*)函数并且消息为unexpected $undefined.我无法理解为什么会发生这种情况。减少应该识别left value xassignmentconstant String "Hello World",我出错了什么?

1 个答案:

答案 0 :(得分:2)

问题在于您显然已将STR定义为令牌和lex启动状态。这两个实际上都是宏(扩展为整数常量文字),因此您可能会在编译器输出中的某处重新定义宏STR。上面代码中的return STR;最终返回STR的开始状态代码而不是令牌代码,而bison生成的解析器无法将其识别为有效的令牌代码。