I have a file, parser.mly, which has the following
%{
open Ast
%}
(* Ast holds the abstract syntax tree type definitions. *)
%token EOF
%token OR
%left OR
%start <Ast.prog> prog
%%
prog:
| e = expr; EOF {e}
;
expr:
| e1 = expr; OR; e2 = expr { Binop(Or, e1, e2) }
;
I'm trying to add a definition for function application.
However, function application doesn't have its own token. It's just an expression followed by another expression.
When I try to code this with something like
| e1 = expr; e2 = expr { App(e1, e2) }
very understandably, the compiler gives the error message that 2 states have shift/reduce conflicts, because this kind of rule introduces ambiguity.
Now I can eliminate the ambiguity that comes with OR tokens by declaring them left-associative. But how do I do it in this case, where no token can be declared to be left-associative?