首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stream menhir -简单语法流冲突的结束

stream menhir -简单语法流冲突的结束
EN

Stack Overflow用户
提问于 2014-10-29 20:34:14
回答 1查看 806关注 0票数 3

我正在试用Menhir,用(+,-,* /操作符)生成一个非常简单的表达式解析器,但是流冲突结束了。下面是语法:

代码语言:javascript
复制
%token <int> INT
%token ADD
%token SUB
%token MUL
%token DIV
%token EOF
%token LPAREN
%token RPAREN

%start <Expr.ast option> top_expr

%%

top_expr:
    | EOF
    { None }

    | r = expr
    { Some r }
    ;

expr:
    | r = term
    { r }

    | l = expr; ADD; r = term
    { Expr.Add (l,r) }

    | l = expr; SUB; r = term
    { Expr.Sub (l,r) }
    ;

term:
    | r = atom
    { r }

    | l = term; MUL; r = atom
    { Expr.Mul (l,r) }

    | l = term; DIV; r = atom
    { Expr.Div (l,r) }
    ;

atom:
    | LPAREN; r = expr; RPAREN
    { r }

    | r = INT
    { Expr.INT r }

我得到的警告是:

代码语言:javascript
复制
Warning: 9 states have an end-of-stream conflict.
File "expr_parser.mly", line 18, characters 6-19:
Warning: production top_expr -> expr is never reduced.

如何防止这一警告?

这里是由menhir生成的.automaton文件

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-30 01:45:36

看起来,您需要向第二个子句添加显式EOF。

代码语言:javascript
复制
 top_expr:
    | EOF
    { None }

    | r = expr EOF
    { Some r }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26640144

复制
相关文章

相似问题

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