(* * Menhir wygeneruje funkcję o nazwie file *) %start file %{ open Xi_lib open Ast open Parser_utils (* Generator znaczników *) let mkTag = let i = ref 0 in fun () -> let tag = !i in incr i; NodeTag tag (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv * Miejsce na twój kod w Ocamlu *) (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----------------------------------------------------------------------------- *) %} (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv * Miejsce na dyrektywy *) %token EOF %token LPAREN %token RPAREN %token LBRACKET %token RBRACKET %token LSBRACKET %token RSBRACKET %token COLON %token OP_PLUS %token OP_MINUS %token OP_MULT %token OP_DIV %token OP_REM %token OP_AND %token OP_OR %token OP_EQ %token OP_NEQ %token OP_LE %token OP_GE %token OP_LT %token OP_GT %token ASSIGN %token IF %token ELSE %token WHILE %token RETURN %token LENGTH %token INT %token IDENTIFIER %token CHAR %token BOOL %token T_BOOL %token T_INT (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----------------------------------------------------------------------------- *) %% (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv * Miejsce na gramatykę *) (* Obecnie potrafimy sparsować tylko pusty plik (wymagamy od razu tokena EOF) *) file: | declarations= list(func) EOF { ModuleDefinition {global_declarations=declarations } } | EOF { ModuleDefinition {global_declarations=[] } } func: | id=identifier LPAREN parameters=list(argument) RPAREN { GDECL_Function { loc=mkLocation $startpos; id=id;formal_parameters=parameters; return_types=[];body=None} } argument: | id = identifier COLON t=typ { VarDecl {loc=mkLocation $startpos;id=id;tp=t} } typ: | t=base_type { t } | t=typ LSBRACKET dim=option(expression) RSBRACKET { TEXPR_Array { loc=mkLocation $startpos; sub=t;dim=dim } } base_type: | T_INT {TEXPR_Int {loc=mkLocation $startpos}} | T_BOOL {TEXPR_Bool {loc=mkLocation $startpos}} expression: | value=INT { EXPR_Int {tag= mkTag ();loc=mkLocation $startpos; value=Int32.of_int value} } identifier: | IDENTIFIER { Identifier $1 } (* ** przykład użycia mkLocation use_declaration: | USE suffix(identifier, opt(SEMICOLON)) { GDECL_Use {loc=mkLocation $startpos; id=$2} } ** przykład użycia mkTag atomic_expression: | identifier { EXPR_Id {loc=mkLocation $startpos; id=$1; tag=mkTag ()} } *) (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----------------------------------------------------------------------------- *)