Основная проблема с yacc / lex - PullRequest
2 голосов
/ 27 июля 2010

У меня есть некоторые проблемы с очень простой программой 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 program начало моей грамматики (где 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 Ответ

3 голосов
/ 27 июля 2010

Проблема в том, что если вы не сохраните токен, Lex / Yacc продолжит перезаписывать пространство, или указывать на другое пространство, и т. Д. Таким образом, вам нужно спрятать информацию, которая важна для вас, прежде чем она будет изменена.Ваша печать в коде Lex должна была показать вам, что значения yylval были точными в тот момент, когда был вызван лексер (лексический анализатор).

См. Также SO 2696470 , где то же самоеосновная проблема была обнаружена и диагностирована.

...