2014-10-29 10 views
2

(+, -, *,/연산자)를 사용하여 매우 간단한 식 구문 분석기를 생성하기 위해 Menhir을 테스트하고 있지만 스트림 충돌이 끝납니다.ocaml 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 file입니다.

+0

.automaton 파일의 깨진 링크 –

답변

2

두 번째 절에 명시 적 EOF를 추가해야하는 것처럼 보입니다.

top_expr: 
    | EOF 
    { None } 

    | r = expr EOF 
    { Some r } 
+0

그렇습니다! 감사. – soumik