summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorPaweł Dybiec <pdybiec@stud.cs.uni.wroc.pl>2018-11-10 01:29:56 +0100
committerPaweł Dybiec <pdybiec@stud.cs.uni.wroc.pl>2018-11-10 01:29:56 +0100
commit96b8e795b776c2e195d5551e136ced85b8b44141 (patch)
tree1fca4f63c67dff2cfb36cd8f4d865ba7a26e991b /source
parentAdd boolean literals (diff)
Fixed ambiguity for if else
Diffstat (limited to 'source')
-rw-r--r--source/mod_student/parser.mly16
1 files changed, 15 insertions, 1 deletions
diff --git a/source/mod_student/parser.mly b/source/mod_student/parser.mly
index 2665861..4d1a142 100644
--- a/source/mod_student/parser.mly
+++ b/source/mod_student/parser.mly
@@ -195,11 +195,25 @@ statement:
{STMT_VarDecl { var=var;init=init } }
| WHILE cond=expression body=statement
{ STMT_While {loc=mkLocation $startpos;cond=cond;body=body } }
- | IF cond=expression then_branch=statement else_branch=option(preceded(ELSE,statement)) (*Menhir attempts to mimic ocamlyacc’s specification, that is, to resolve shift/reduce conflicts in favor of shifting*)
+ | IF cond=expression then_branch=statement2 else_branch=option(preceded(ELSE,statement)) (*Menhir attempts to mimic ocamlyacc’s specification, that is, to resolve shift/reduce conflicts in favor of shifting*)
{ STMT_If {loc=mkLocation $startpos;cond=cond;then_branch=then_branch;
else_branch=else_branch } }
| head=option_var_decl COMMA tail=separated_nonempty_list(COMMA, option_var_decl) ASSIGN call=call
{ STMT_MultiVarDecl {loc=mkLocation $startpos; vars= head::tail; init=call } }
+statement2:
+ | left=lvalue ASSIGN right=expression { STMT_Assign {loc=mkLocation $startpos;
+ lhs=left;rhs=right} }
+ | block=statement_block {STMT_Block block }
+ | call=call {STMT_Call call }
+ | var=var_decl init=option(preceded(ASSIGN,expression))
+ {STMT_VarDecl { var=var;init=init } }
+ | WHILE cond=expression body=statement2
+ { STMT_While {loc=mkLocation $startpos;cond=cond;body=body } }
+ | IF cond=expression then_branch=statement2 ELSE else_branch=statement2
+ { STMT_If {loc=mkLocation $startpos;cond=cond;then_branch=then_branch;
+ else_branch=Some else_branch } }
+ | head=option_var_decl COMMA tail=separated_nonempty_list(COMMA, option_var_decl) ASSIGN call=call
+ { STMT_MultiVarDecl {loc=mkLocation $startpos; vars= head::tail; init=call } }
return_stmt:
| RETURN values=separated_list(COMMA,expression)
{ [STMT_Return { loc=mkLocation $startpos; values=values }] }