首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bison -为什么这会对所有输入产生语法错误

Bison -为什么这会对所有输入产生语法错误
EN

Stack Overflow用户
提问于 2021-01-24 23:01:17
回答 1查看 19关注 0票数 0

我写了一个简单的语法:

代码语言:javascript
复制
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是首次使用标识符的声明符。

但是这个bison文件显示了以下警告:

代码语言:javascript
复制
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>

所以请谁帮帮我,指出我哪里出了问题。

EN

Stack Overflow用户

回答已采纳

发布于 2021-01-24 23:12:33

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

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

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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65872135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档