来自lex和yacc的运行时“语法错误”

时间:2013-03-13 02:25:52

标签: syntax-error yacc lex flex-lexer

我无法弄清楚为什么我会得到这些结果。

++
+add
+syntax error 2

++
+add
+syntax error 4

++是我的输入,lex回应每个字符,只要得到+,yacc就会添加。它给了我这个错误的其他所有+它得到。无论我如何给出输入,如果我在每个+上按Enter键,我会得到相同的结果。

%{
#include "y.tab.h"

int chars = 0;
%}
%%
"+"     {ECHO; chars++; return ADD;}
.       {ECHO; chars++;}
\n      {ECHO;}
%%

YACC

%{
#include <stdio.h>
extern int chars;

void yyerror (const char *str) {
    printf ("%s %d\n", str, chars);
}
%}

%token ADD
%%
symbol  : ADD       {printf ("add\n");}
        ;
%%

int main () {
    while (1) {
        yyparse ();
    }
}

1 个答案:

答案 0 :(得分:2)

您的语法只接受由单个标记+组成的“句子”。当您键入第二个+时,会导致语法错误;你的语法不允许ADD后跟ADD。 +之后的下一个标记必须是EOF,语法才能接受您的输入。 (由于.\n规则,您可以在代码中键入各种其他内容,但输入中只能有一个+。)