X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fparser.mly;h=9b1a91247767be286ec48f691b1c54bca8432837;hb=98b795ddf06271fa8018edcd0bd15960871828fd;hp=aca014eecb089e01177a04a1ec40eed56b40f388;hpb=2ac1b84cb49ad04e27b4543436b0227153fbfb15;p=goals.git diff --git a/src/parser.mly b/src/parser.mly index aca014e..9b1a912 100644 --- a/src/parser.mly +++ b/src/parser.mly @@ -38,7 +38,7 @@ let find_on_include_path filename = let path = inc // filename in if Sys.file_exists path then path else loop incs in - loop Cmdline.includes + loop (Cmdline.includes ()) ) let do_include env loc filename optflag file = @@ -60,11 +60,12 @@ let do_include env loc filename optflag file = %} (* Tokens. *) -%token CODE +%token CODE %token COLON %token COMMA %token EQUALS %token EOF +%token EXPRESSION %token FUNCTION %token GOAL %token ID @@ -73,16 +74,20 @@ let do_include env loc filename optflag file = %token LEFT_PAREN %token LET %token OPTINCLUDE +%token PURE +%token RETURNING %token RIGHT_ARRAY %token RIGHT_PAREN %token SEMICOLON %token STRING -%token TACTIC -%token TACTIC_KEYWORD +%token STRING_KEYWORD +%token STRINGS +%token PRED +%token PREDICATE (* Start nonterminals. *) %start file -%start expr +%start expr_only %% file: @@ -113,13 +118,17 @@ stmt: let name, params = $1 in name, Ast.EGoalDefn ($loc, (params, [], [], Some $2)) } - | FUNCTION ID params_decl EQUALS CODE + | GOAL ID { - $2, Ast.EFuncDefn ($loc, ($3, $5)) + $2, Ast.EGoalDefn ($loc, ([], [], [], None)) } - | TACTIC_KEYWORD TACTIC params_decl EQUALS CODE + | option(PURE) FUNCTION ID params_decl return_decl EQUALS CODE { - $2, Ast.ETacticDefn ($loc, ($3, $5)) + $3, Ast.EFuncDefn ($loc, ($4, $5, $1 <> None, $7)) + } + | PREDICATE PRED params_decl EQUALS CODE + { + $2, Ast.EPredDefn ($loc, ($3, $5)) } | LET ID EQUALS expr { $2, $4 } ; @@ -133,13 +142,18 @@ params_decl: ; param_decl: | ID { $1 } +return_decl: + | { RetExpr } + | RETURNING EXPRESSION { RetExpr } + | RETURNING STRINGS { RetStrings } + | RETURNING STRING_KEYWORD { RetString } patterns: | separated_list(COMMA, pattern) { $1 } ; pattern: - | STRING { Ast.PTactic ($loc, "*file", [$1]) } - | ID pattern_params { Ast.PTactic ($loc, $1, $2) } + | STRING { Ast.PPred ($loc, "is-file", [$1]) } + | PRED pattern_params { Ast.PPred ($loc, $1, $2) } ; pattern_params: | LEFT_PAREN separated_list(COMMA, pattern_param) RIGHT_PAREN { $2 } @@ -151,7 +165,7 @@ pattern_param: expr: | ID params { Ast.ECall ($loc, $1, $2) } | ID { Ast.EVar ($loc, $1) } - | TACTIC params { Ast.ETacticCtor ($loc, $1, $2) } + | PRED params { Ast.EPredCtor ($loc, $1, $2) } | STRING { Ast.ESubsts ($loc, $1) } | LEFT_ARRAY barelist RIGHT_ARRAY { Ast.EList ($loc, $2) } ; @@ -162,6 +176,13 @@ params: | LEFT_PAREN separated_list(COMMA, expr) RIGHT_PAREN { $2 } ; +(* This is used by Parse.parse_expr where we have to parse + * a standalone string (eg. from the command line). + *) +expr_only: + | expr EOF { $1 } + ; + (* http://gallium.inria.fr/blog/lr-lists/ *) right_flexible_list(delim, X): | (* nothing *) { [] }