3

(+、-、​​、/ 演算子) を使用して非常に単純な式パーサーを生成するために Menhir を試していますが、ストリームの競合が終了します。文法は次のとおりです。

%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 }

私が得る警告は次のとおりです。

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 ファイルです。

4

1 に答える 1

2

明示的な EOF を 2 番目の句に追加する必要があるようです。

 top_expr:
    | EOF
    { None }

    | r = expr EOF
    { Some r }
于 2014-10-30T01:45:36.053 に答える