1

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

++
+add
+syntax error 2

++
+add
+syntax error 4

++ 是我的输入,而 lex 会回显每个字符,并且 yacc 打印在它获得 + 时添加。它每隔一个+就给我这个错误。不管我如何输入,如果我在每个 + 上按回车,我都会得到相同的结果。

%{
#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 ();
    }
}
4

1 回答 1

2

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

于 2013-03-13T02:32:54.450 回答