Дополнительная правая скобка в выводе yacc - PullRequest
1 голос
/ 19 апреля 2011

Мой файл lex имеет:

word [^{}"=,\t\n@\\ ]+

\{  {
    return(LBRACE);
}

\}  {
    return(RBRACE);
}

{word}  {
     yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}

Мой файл yacc имеет:

phrase: LBRACE WORD RBRACE  {printf("LBRACE %s RBRACE\n",$2);};

При вводе:

{FooBar}

Я получаю:

WORD=FooBar
LBRACE FooBar} RBRACE

Я не уверен, почему я получаю дополнительную правильную скобку, хотя я печатаю только 2 доллара, что должно идеально

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Здесь:

{word}  {
     yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}

Значение yytext действует только при обработке этой лексемы.После перехода к следующей лексеме содержимое буфера может быть перезаписано.Таким образом, сохранение указателя yytext не принесет вам никакой пользы.Вам необходимо скопировать токен из буфера.

{word}   {  yylval = (char*)calloc(yylen+1, sizeof(char));
            strncpy(yylval, yytext, yylen); // Remember you need to free this.
            return WORD;
         }
2 голосов
/ 19 апреля 2011

Вы должны сохранить значение yytext (через yylval) в производстве WORD. Это просто указатель на рабочее пространство lex. Вы видите изменение рабочего пространства после его разбора RBRACE. Представьте себе правило yacc вроде LBRACE WORD COMMA WORD LBRACE и что там будет происходить.

Если вы не хотите иметь отдельное производство, я думаю, вы можете сделать LBRACE WORD { code to strdup yylval } RBRACE { ... }

...