2016-04-14 3 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. I не может понять, почему это происходит. Сокращение должно признавать left valuex, assignment и constant String"Hello World", что я получаю не так?

ответ

2

Проблема в том, что вы, по-видимому, определили STR как токен, так и начало лексического начала. Оба они на самом деле являются макросами (которые расширяются до целых константных литералов), поэтому у вас, вероятно, есть предупреждение о том, что макрос STR переопределяется где-то в вашем компиляторе. return STR; в вашем коде заканчивается тем, что возвращает код старта состояния для STR вместо кода токена, который обработанный бизоном анализатор не распознает как действительный код токена.

+0

спасибо! вот и все! – Jack

Смежные вопросы