parsing warning removed.

This commit is contained in:
Léonard Gérard 2010-06-29 19:03:42 +02:00
parent 7c0c2e0415
commit 88732ef2a9
4 changed files with 12 additions and 102 deletions

View file

@ -45,21 +45,17 @@ List.iter (fun (str,tok) -> Hashtbl.add keyword_table str tok) [
"state", STATE; "state", STATE;
"unless", UNLESS; "unless", UNLESS;
"until", UNTIL; "until", UNTIL;
"emit", EMIT;
"last", LAST; "last", LAST;
"if", IF; "if", IF;
"then", THEN; "then", THEN;
"else", ELSE; "else", ELSE;
"default", DEFAULT; "default", DEFAULT;
"continue", CONTINUE; "continue", CONTINUE;
"case", CASE;
"do", DO; "do", DO;
"contract", CONTRACT; "contract", CONTRACT;
"assume", ASSUME; "assume", ASSUME;
"enforce", ENFORCE; "enforce", ENFORCE;
"with", WITH; "with", WITH;
"inlined", INLINED;
"with", WITH;
"map", MAP; "map", MAP;
"fold", FOLD; "fold", FOLD;
"mapfold", MAPFOLD; "mapfold", MAPFOLD;
@ -170,22 +166,6 @@ rule token = parse
{ INT (int_of_string(Lexing.lexeme lexbuf)) } { INT (int_of_string(Lexing.lexeme lexbuf)) }
| ['0'-'9']+ ('.' ['0'-'9']*)? (['e' 'E'] ['+' '-']? ['0'-'9']+)? | ['0'-'9']+ ('.' ['0'-'9']*)? (['e' 'E'] ['+' '-']? ['0'-'9']+)?
{ FLOAT (float_of_string(Lexing.lexeme lexbuf)) } { FLOAT (float_of_string(Lexing.lexeme lexbuf)) }
| "\""
{ reset_string_buffer();
let string_start = lexbuf.lex_start_pos + lexbuf.lex_abs_pos in
begin try
string lexbuf
with Lexical_error(Unterminated_string, _, string_end) ->
raise(Lexical_error(Unterminated_string, string_start, string_end))
end;
lexbuf.lex_start_pos <- string_start - lexbuf.lex_abs_pos;
STRING (get_stored_string()) }
| "'" [^ '\\' '\''] "'"
{ CHAR(Lexing.lexeme_char lexbuf 1) }
| "'" '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'"
{ CHAR(char_for_backslash (Lexing.lexeme_char lexbuf 2)) }
| "'" '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'"
{ CHAR(char_for_decimal_code lexbuf 2) }
| "(*@ " (['A'-'Z' 'a'-'z']('_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9']) * as id) | "(*@ " (['A'-'Z' 'a'-'z']('_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9']) * as id)
{ {
reset_string_buffer(); reset_string_buffer();

View file

@ -15,10 +15,8 @@ open Parsetree
%token <int> INT %token <int> INT
%token <float> FLOAT %token <float> FLOAT
%token <bool> BOOL %token <bool> BOOL
%token <char> CHAR
%token <string> STRING
%token <string * string> PRAGMA %token <string * string> PRAGMA
%token TYPE FUN NODE RETURNS VAR VAL IN OPEN END CONST %token TYPE FUN NODE RETURNS VAR VAL OPEN END CONST
%token FBY PRE SWITCH WHEN EVERY %token FBY PRE SWITCH WHEN EVERY
%token OR STAR NOT %token OR STAR NOT
%token AMPERSAND %token AMPERSAND
@ -29,7 +27,6 @@ open Parsetree
%token STATE %token STATE
%token UNLESS %token UNLESS
%token UNTIL %token UNTIL
%token EMIT
%token LAST %token LAST
%token IF %token IF
%token THEN %token THEN
@ -37,12 +34,10 @@ open Parsetree
%token DEFAULT %token DEFAULT
%token DO %token DO
%token CONTINUE %token CONTINUE
%token CASE
%token CONTRACT %token CONTRACT
%token ASSUME %token ASSUME
%token ENFORCE %token ENFORCE
%token WITH %token WITH
%token INLINED
%token POWER %token POWER
%token LBRACKET %token LBRACKET
%token RBRACKET %token RBRACKET
@ -63,9 +58,8 @@ open Parsetree
%left WITH %left WITH
%nonassoc prec_ident %nonassoc prec_ident
%nonassoc LBRACKET %nonassoc LBRACKET
%left IF ELSE %left ELSE
%right ARROW %right ARROW
%nonassoc EVERY
%left OR %left OR
%left AMPERSAND %left AMPERSAND
%left INFIX0 EQUAL %left INFIX0 EQUAL
@ -77,8 +71,6 @@ open Parsetree
%right prec_uminus %right prec_uminus
%right FBY %right FBY
%right PRE %right PRE
%right LAST
%right prec_apply
%left POWER %left POWER
%right PREFIX %right PREFIX
%left DOT %left DOT
@ -413,7 +405,7 @@ exp:
{ mk_exp (Eapp(mk_app Efby, [$1; $3])) } { mk_exp (Eapp(mk_app Efby, [$1; $3])) }
| PRE exp | PRE exp
{ mk_exp (Eapp(mk_app (Epre None), [$2])) } { mk_exp (Eapp(mk_app (Epre None), [$2])) }
| node_name LPAREN exps RPAREN %prec prec_apply | node_name LPAREN exps RPAREN
{ mk_exp (mk_call $1 $3) } { mk_exp (mk_call $1 $3) }
| NOT exp | NOT exp
{ mk_exp (mk_op_call "not" [] [$2]) } { mk_exp (mk_op_call "not" [] [$2]) }
@ -463,10 +455,10 @@ exp:
| exp AROBASE exp | exp AROBASE exp
{ mk_exp (mk_array_op_call Econcat [$1; $3]) } { mk_exp (mk_array_op_call Econcat [$1; $3]) }
/*Iterators*/ /*Iterators*/
| iterator longname DOUBLE_LESS simple_exp DOUBLE_GREATER LPAREN exps RPAREN %prec prec_apply | iterator longname DOUBLE_LESS simple_exp DOUBLE_GREATER LPAREN exps RPAREN
{ mk_exp (mk_iterator_call $1 $2 [] ($4::$7)) } { mk_exp (mk_iterator_call $1 $2 [] ($4::$7)) }
| iterator LPAREN longname DOUBLE_LESS array_exp_list DOUBLE_GREATER | iterator LPAREN longname DOUBLE_LESS array_exp_list DOUBLE_GREATER
RPAREN DOUBLE_LESS simple_exp DOUBLE_GREATER LPAREN exps RPAREN %prec prec_apply RPAREN DOUBLE_LESS simple_exp DOUBLE_GREATER LPAREN exps RPAREN
{ mk_exp (mk_iterator_call $1 $3 $5 ($9::$12)) } { mk_exp (mk_iterator_call $1 $3 $5 ($9::$12)) }
/*Records operators */ /*Records operators */
| exp WITH DOT longname EQUAL exp | exp WITH DOT longname EQUAL exp

View file

@ -19,44 +19,23 @@ let keyword_table = ((Hashtbl.create 149) : (string, token) Hashtbl.t);;
List.iter (fun (str,tok) -> Hashtbl.add keyword_table str tok) [ List.iter (fun (str,tok) -> Hashtbl.add keyword_table str tok) [
"node", NODE; "node", NODE;
"fun", FUN;
"returns", RETURNS; "returns", RETURNS;
"var", VAR; "var", VAR;
"let", LET; "let", LET;
"tel", TEL; "tel", TEL;
"fby", FBY; "fby", FBY;
"switch", SWITCH;
"when", WHEN; "when", WHEN;
"type", TYPE; "type", TYPE;
"every", EVERY;
"true", BOOL(true); "true", BOOL(true);
"false", BOOL(false); "false", BOOL(false);
"pre", PRE; "pre", PRE;
"or", OR; "or", OR;
"not", NOT; "not", NOT;
"open", OPEN; "open", OPEN;
"automaton", AUTOMATON;
"switch", SWITCH;
"present", PRESENT;
"reset", RESET; "reset", RESET;
"state", STATE;
"unless", UNLESS;
"until", UNTIL;
"emit", EMIT;
"last", LAST;
"if", IF; "if", IF;
"then", THEN; "then", THEN;
"else", ELSE; "else", ELSE;
"default", DEFAULT;
"continue", CONTINUE;
"case", CASE;
"do", DO;
"contract", CONTRACT;
"assume", ASSUME;
"enforce", ENFORCE;
"with", WITH;
"inlined", INLINED;
"at", AT;
"quo", INFIX3("quo"); "quo", INFIX3("quo");
"mod", INFIX3("mod"); "mod", INFIX3("mod");
"land", INFIX3("land"); "land", INFIX3("land");
@ -155,22 +134,6 @@ rule token = parse
{ INT (int_of_string(Lexing.lexeme lexbuf)) } { INT (int_of_string(Lexing.lexeme lexbuf)) }
| '-'? ['0'-'9']+ ('.' ['0'-'9']*)? (['e' 'E'] ['+' '-']? ['0'-'9']+)? | '-'? ['0'-'9']+ ('.' ['0'-'9']*)? (['e' 'E'] ['+' '-']? ['0'-'9']+)?
{ FLOAT (float_of_string(Lexing.lexeme lexbuf)) } { FLOAT (float_of_string(Lexing.lexeme lexbuf)) }
| "\""
{ reset_string_buffer();
let string_start = lexbuf.lex_start_pos + lexbuf.lex_abs_pos in
begin try
string lexbuf
with Lexical_error(Unterminated_string, _, string_end) ->
raise(Lexical_error(Unterminated_string, string_start, string_end))
end;
lexbuf.lex_start_pos <- string_start - lexbuf.lex_abs_pos;
STRING (get_stored_string()) }
| "'" [^ '\\' '\''] "'"
{ CHAR(Lexing.lexeme_char lexbuf 1) }
| "'" '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'"
{ CHAR(char_for_backslash (Lexing.lexeme_char lexbuf 2)) }
| "'" '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'"
{ CHAR(char_for_decimal_code lexbuf 2) }
| "(*@ " (['A'-'Z' 'a'-'z']('_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9']) * as id) | "(*@ " (['A'-'Z' 'a'-'z']('_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9']) * as id)
{ {
reset_string_buffer(); reset_string_buffer();

View file

@ -25,35 +25,16 @@ let mk_var name ty = mk_var_dec name ty
%token <int> INT %token <int> INT
%token <float> FLOAT %token <float> FLOAT
%token <bool> BOOL %token <bool> BOOL
%token <char> CHAR
%token <string> STRING
%token <string * string> PRAGMA %token <string * string> PRAGMA
%token TYPE FUN NODE RETURNS VAR OPEN %token TYPE NODE RETURNS VAR OPEN
%token FBY PRE SWITCH WHEN EVERY %token FBY PRE WHEN
%token OR STAR NOT %token OR STAR NOT
%token AMPERSAND %token AMPERSAND
%token AMPERAMPER %token AMPERAMPER
%token AUTOMATON
%token PRESENT
%token RESET %token RESET
%token STATE
%token UNLESS
%token UNTIL
%token EMIT
%token LAST
%token IF %token IF
%token THEN %token THEN
%token ELSE %token ELSE
%token DEFAULT
%token DO
%token CONTINUE
%token CASE
%token CONTRACT
%token ASSUME
%token ENFORCE
%token WITH
%token INLINED
%token AT
%token DOUBLE_LESS DOUBLE_GREATER %token DOUBLE_LESS DOUBLE_GREATER
%token <string> PREFIX %token <string> PREFIX
%token <string> INFIX0 %token <string> INFIX0
@ -65,23 +46,17 @@ let mk_var name ty = mk_var_dec name ty
%token EOF %token EOF
%nonassoc prec_ident %left ELSE
%left IF ELSE
%right ARROW
%nonassoc EVERY
%left OR %left OR
%left AMPERSAND %left AMPERSAND
%left INFIX0 EQUAL %left INFIX0 EQUAL
%right INFIX1 EQUALEQUAL BARBAR AMPERAMPER %right INFIX1 EQUALEQUAL BARBAR AMPERAMPER
%left INFIX2 SUBTRACTIVE %left INFIX2 prefixs
%left STAR INFIX3 %left STAR INFIX3
%left INFIX4 %left INFIX4
%right prefixs
%right FBY %right FBY
%right PRE %right PRE
%right LAST
%right prec_apply
%left DOT
@ -164,7 +139,7 @@ equs: LET e=slist(SEMICOL, equ) TEL { e }
equ: p=pat EQUAL e=exp { mk_equation p e } equ: p=pat EQUAL e=exp { mk_equation p e }
pat: pat:
| n=NAME {Evarpat (ident_of_name n)} | n=NAME {Evarpat (ident_of_name n)}
| LPAREN p=snlist(COMMA, pat) RPAREN {Etuplepat p} | LPAREN p=snlist(COMMA, pat) RPAREN {Etuplepat p}
longname: l=qualified(name) {l} longname: l=qualified(name) {l}
@ -199,7 +174,7 @@ exp:
| p_op=prefix e=exp %prec prefixs | p_op=prefix e=exp %prec prefixs
{ mk_exp (Ecall(mk_op ~op_kind:Eop p_op, [e], None)) } { mk_exp (Ecall(mk_op ~op_kind:Eop p_op, [e], None)) }
| IF e1=exp THEN e2=exp ELSE e3=exp { mk_exp (Eifthenelse(e1, e2, e3)) } | IF e1=exp THEN e2=exp ELSE e3=exp { mk_exp (Eifthenelse(e1, e2, e3)) }
| e=simple_exp DOT m=longname { mk_exp (Efield(e, m)) } | e=simple_exp DOT m=longname { mk_exp (Efield(e, m)) }