代码之家  ›  专栏  ›  技术社区  ›  TreeTree

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

  •  1
  • TreeTree  · 技术社区  · 13 年前

    我不明白为什么我会得到这些结果。

    ++
    +add
    +syntax error 2
    
    ++
    +add
    +syntax error 4
    

    ++是我的输入,lex会回显每个字符,yacc会在得到+时打印add。它每隔一次都会给我这个错误。无论我如何输入,如果我在每个+上点击回车键,我都会得到相同的结果。

    法

    %{
    #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 回复  |  直到 13 年前
        1
  •  2
  •   Jonathan Leffler    13 年前

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

    推荐文章