2016-04-14 105 views
0
%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的字符串,例如"Hello World")并将它们返回给我们的解析器进行处理。处理字符串时解析错误

我还建造了使用Yacc工具的分析器,它的不同之处,从当我们为变量分配字符串近乎完美的(例如:x="Hello World";) 当我这样做,yyerror(const char*)函数被调用和消息是unexpected $undefined.我不明白为什么会发生这种情况。减少应该承认left valuexassignmentconstant String"Hello World",我出了什么问题?

回答

2

问题是,你已经明确地将STR定义为令牌和lex开始状态。这两个实际上都是宏(扩展为整型常量字面值),因此您可能会在编译器输出中重新定义宏STR的警告。上面的代码中的return STR;最终返回STR的启动状态代码,而不是令牌代码,而野牛生成的分析器不会将其识别为有效的令牌代码。

+0

谢谢!就是这样! – Jack