【问题标题】:Bison - why this is producing syntax error for all inputsBison - 为什么这会为所有输入产生语法错误
【发布时间】:2021-01-24 15:01:17
【问题描述】:

我写了一个简单的语法:


expr:
    INT { $$ = intc($1); }
    | FLOAT { $$ = floatc($1); }
    | STR { $$ = strc($1); }
    | ID { $$ = id($1, false); }
    | ID '=' expr { $$ = operate('=', id($1, false), $3); }
    | VAR ID { $$ = id($2, true); }
    | VAR ID '=' expr { $$ = operate('=', id($2, true), $4); }
    | '-' expr %prec NEG { $$ = operate(NEG, $2, NULL); }
    | expr '+' expr { $$ = operate('+', $1, $3); }
    | expr '-' expr { $$ = operate('-', $1, $3); }
    | expr '*' expr { $$ = operate('*', $1, $3); }
    | expr '/' expr { $$ = operate('/', $1, $3); }
    | '(' expr ')' { $$ = $2; }
    ;

stmt:
    ';' {}
    | expr ';' { compile($1); }
    ;

prog:
    prog stmt {}
    |
    ;

其中 INT、FLOAT 和 STR 是分别对应整数、浮点和字符串字面量的词法标记,ID 是有效标识符,VAR 是第一次使用标识符时的声明符。

但是这个野牛文件显示了这些警告:

lang.y: warning: 2 nonterminals useless in grammar [-Wother]
lang.y: warning: 4 rules useless in grammar [-Wother]
lang.y:73.1-4: warning: nonterminal useless in grammar: stmt [-Wother]
 stmt:
 ^^^^
lang.y:78.1-4: warning: nonterminal useless in grammar: prog [-Wother]
 prog:
 ^^^^
lang.y:74.9-14: warning: rule useless in grammar [-Wother]
        ';' {}
         ^^^^^^
lang.y:75.11-35: warning: rule useless in grammar [-Wother]
        | expr ';' { compile($1); }
           ^^^^^^^^^^^^^^^^^^^^^^^^^
lang.y:79.9-20: warning: rule useless in grammar [-Wother]
        prog stmt {}
         ^^^^^^^^^^^^
lang.y:80.10: warning: rule useless in grammar [-Wother]
        |
          ^
lang.y: warning: 19 shift/reduce conflicts [-Wconflicts-sr]

每当我输入以分号结尾的语句时,它也会产生syntax error, unexpected ';' 错误。如果我在第一行不使用分号,那么当我输入第二行时,它会产生syntax error, unexpected <FIRST_TOKEN_IN_SECOND_LINE>

所以请有人帮助我,指出我哪里出错了。

【问题讨论】:

    标签: parsing bison flex-lexer


    【解决方案1】:

    解析从语法的非终结符开始。如果您不使用%start 设置开始规则,则语法中定义的第一个非终结符将是您的开始规则。

    所以在你的语法中,开始非终结符将是expr。因此,您的输入会产生语法错误,因为它们与 expr 不匹配,而您的其他非终端则无用,因为 expr 从未使用过它们。

    如果您希望解析以 prog 开头,则需要添加指令 %start prog 或将 prog 移动到语法的开头。

    【讨论】:

    • 接受答案是否有超时时间......!?我现在才知道。无论如何,谢谢.. 现在解析器工作得很好。除了班次减少错误,其他人都走了。 :)
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多