diff --git a/Makefile b/Makefile index 85875cc..f8f50a1 100644 --- a/Makefile +++ b/Makefile @@ -30,3 +30,6 @@ archive: symlinks: ln -s _build/*.cmi . + +menhir-debug: + menhir parser.mly --explain --infer diff --git a/parser.mly b/parser.mly index 572dc89..efe3872 100644 --- a/parser.mly +++ b/parser.mly @@ -18,17 +18,10 @@ %left Ladd Lsub Lmul Ldiv Lrem Lseq Lsge Lsgt Lsle Lslt Lsne %left Land Lor -%left Lbracedeb Lparfin Lbracefin Lreturn -%left Ltype Lbool Lint Lvar Lstr -%left Lif Lwhile +%type prog %start prog -%type block -%type prog -%type args_ident -%type args_expr - %% prog: @@ -38,42 +31,19 @@ prog: | Lend { [] } def: - /* Définition fonction : type fonction (args) block */ + /* Définition fonction : type fonction (...) block */ | t = Ltype ; f = Lvar - ; a = args_ident + ; Lpardeb + ; a = separated_list(Lcomma, arg) + ; Lparfin ; b = block { [ Func { func = f ; type_t = t ; args = a ; code = b ; pos = $startpos(f) } ] } - /* Définition fonction : type fonction () block */ - | t = Ltype - ; f = Lvar - ; Lpardeb - ; Lparfin - ; b = block { - [ Func { func = f ; type_t = t ; args = [] ; code = b ; pos = $startpos(f) } ] - } - -args_ident: - /* ( */ - | Lpardeb ; s = args_ident { s } - - /* type a, ... */ - | t = Ltype ; a = arg_ident ; Lcomma ; s = args_ident { Arg { type_t = t - ; name = a - } :: s } - - /* type c) */ - | t = Ltype ; a = arg_ident ; Lparfin { [ Arg { type_t = t - ; name = a } ] } - - /* ) */ - | Lparfin { [] } - -arg_ident: - /* Argument */ - | a = Lvar { a } +arg: + /* type a */ + | t = Ltype ; a = Lvar { Arg { type_t = t ; name = a } } block: /* { */ @@ -223,18 +193,8 @@ expr: Call { func = "%or" ; args = [ a ; b ] ; pos = $startpos($2) } } - /* function(a */ - | f = Lvar ; Lpardeb ; a = args_expr { + /* function(...) */ + | f = Lvar ; Lpardeb ; a = separated_list(Lcomma, expr) ; Lparfin { Call { func = f ; args = a ; pos = $startpos(a) } } ; - -args_expr: - /* a, ... */ - | a = expr ; Lcomma ; s = args_expr { a :: s } - - /* c) */ - | a = expr ; Lparfin { [ a ] } - - /* ) */ - | Lparfin { [] }