format
This commit is contained in:
parent
f9acb6c76e
commit
f11c33ff18
2 changed files with 104 additions and 100 deletions
|
@ -10,8 +10,6 @@
|
||||||
|
|
||||||
let error lexbuf =
|
let error lexbuf =
|
||||||
error "during lexing" (lex_join lexbuf.lex_start_p lexbuf.lex_curr_p)
|
error "during lexing" (lex_join lexbuf.lex_start_p lexbuf.lex_curr_p)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let newline = ('\010' | '\013' | "\013\010")
|
let newline = ('\010' | '\013' | "\013\010")
|
||||||
|
@ -31,73 +29,73 @@ let printable = [' ' '\t' '\n' '\r' (*33-126*)] (*pas sûr*)
|
||||||
let ident = ['a'-'z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
let ident = ['a'-'z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
||||||
let constr_id = ['A'-'Z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
let constr_id = ['A'-'Z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
||||||
let type_variable = ['\'']['a'-'z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
let type_variable = ['\'']['a'-'z']['A'-'Z' 'a'-'z' '0'-'9' '_']*
|
||||||
(* On ne peut pas différencier au niveau du lexer var_id label_id et type_con, il faudra le faire à l'analyseur syntaxique*)
|
(* On ne peut pas différencier au niveau du lexer var_id label_id et type_con,
|
||||||
|
* il faudra le faire à l'analyseur syntaxique *)
|
||||||
|
|
||||||
let atom = '"'
|
let atom = '"'
|
||||||
let char = ['\'']atom['\'']
|
let char = ['\'']atom['\'']
|
||||||
let string = ['\"']((atom | '\'' | "\\\""))['\"']
|
let string = ['\"']((atom | '\'' | "\\\""))['\"']
|
||||||
|
|
||||||
(*let binop = '+' | '-' | '*' | '/' | "&&" | "||"| "=?"| "<=?" |">=?" |"<?" |">?"*)
|
(* let binop = '+' | '-' | '*' | '/' | "&&" | "||"| "=?"| "<=?" |">=?" |"<?" |">?" *)
|
||||||
|
|
||||||
|
|
||||||
rule token = parse
|
rule token = parse
|
||||||
(** Layout *)
|
(** Layout *)
|
||||||
| newline { next_line_and token lexbuf }
|
| newline { next_line_and token lexbuf }
|
||||||
| blank+ { token lexbuf }
|
| blank+ { token lexbuf }
|
||||||
| eof { EOF }
|
| eof { EOF }
|
||||||
| "{*" { commentary lexbuf; token lexbuf }
|
| "{*" { commentary lexbuf; token lexbuf }
|
||||||
| "##" {commentary_line lexbuf}
|
| "##" { commentary_line lexbuf }
|
||||||
|
|
||||||
(** Keywords *)
|
(** Keywords *)
|
||||||
| "let" { LET }
|
| "let" { LET }
|
||||||
| "type" { TYPE }
|
| "type" { TYPE }
|
||||||
| "extern" { EXTERN }
|
| "extern" { EXTERN }
|
||||||
| "fun" { FUN }
|
| "fun" { FUN }
|
||||||
| "match" { MATCH }
|
| "match" { MATCH }
|
||||||
| "if" { IF }
|
| "if" { IF }
|
||||||
| "then" { THEN }
|
| "then" { THEN }
|
||||||
| "else" { ELSE }
|
| "else" { ELSE }
|
||||||
| "ref" { REF }
|
| "ref" { REF }
|
||||||
| "while" { WHILE }
|
| "while" { WHILE }
|
||||||
| "do" { DO }
|
| "do" { DO }
|
||||||
| "until" { UNTIL }
|
| "until" { UNTIL }
|
||||||
| "for" { FOR }
|
| "for" { FOR }
|
||||||
| "from" { FROM }
|
| "from" { FROM }
|
||||||
| "to" { TO }
|
| "to" { TO }
|
||||||
| "and" { AND }
|
| "and" { AND }
|
||||||
| "for" { FOR }
|
| "for" { FOR }
|
||||||
(* Fini ? *)
|
(* Fini ? *)
|
||||||
|
|
||||||
|
(** Binar operation : pas sûr pour celui là*)
|
||||||
|
(* | binop as b { BINOP (* TODO *) } *)
|
||||||
|
|
||||||
(* binar operation : pas sûr pour celui là*)
|
|
||||||
(*
|
|
||||||
| binop as b { BINOP (* TODO *) }
|
|
||||||
*)
|
|
||||||
(** Operators *)
|
(** Operators *)
|
||||||
| '=' { EQUAL }
|
(* | '=' { EQUAL } *)
|
||||||
|
|
||||||
(* ponctuation *)
|
(* ponctuation *)
|
||||||
| '(' { LPAREN }
|
| '(' { LPAREN }
|
||||||
| ')' { RPAREN }
|
| ')' { RPAREN }
|
||||||
| '[' { LBRACK }
|
| '[' { LBRACK }
|
||||||
| ']' { RBRACK }
|
| ']' { RBRACK }
|
||||||
| '_' { WILDCARD }
|
| '_' { WILDCARD }
|
||||||
| ':' { DPOINT }
|
| ':' { DPOINT }
|
||||||
| "->" { ARROW }
|
| "->" { ARROW }
|
||||||
| "<" { INFERIOR }
|
| "<" { INFERIOR }
|
||||||
| ">" { SUPERIOR }
|
| ">" { SUPERIOR }
|
||||||
|
|
||||||
(** Values *)
|
(** Values *)
|
||||||
| integers as i { INT (Mint.of_string i) }
|
| integers as i { INT (Mint.of_string i) }
|
||||||
| ident as s { ID s }
|
| ident as s { ID s }
|
||||||
|
|
||||||
(** Lexing error *)
|
(** Lexing error *)
|
||||||
| _ { error lexbuf "unexpected character." }
|
| _ { error lexbuf "unexpected character." }
|
||||||
|
|
||||||
and commentary = parse
|
and commentary = parse
|
||||||
| "*}" { () }
|
| "*}" { () }
|
||||||
| "{*" { commentary lexbuf; commentary lexbuf }
|
| "{*" { commentary lexbuf; commentary lexbuf }
|
||||||
| _ { commentary lexbuf }
|
| _ { commentary lexbuf }
|
||||||
|
|
||||||
and commentary_line = parse
|
and commentary_line = parse
|
||||||
| '\n' { next_line_and token lexbuf }
|
| '\n' { next_line_and token lexbuf }
|
||||||
| _ { commentary_line lexbuf }
|
| _ { commentary_line lexbuf }
|
||||||
|
|
|
@ -19,86 +19,89 @@ program:
|
||||||
definition
|
definition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
definition:
|
definition:
|
||||||
| v=vdefinition {
|
| v=vdefinition {
|
||||||
DefineValue v
|
DefineValue v
|
||||||
}
|
}
|
||||||
|
|
||||||
vdefinition: // manque le type ici, on met None en attendant
|
|
||||||
|
vdefinition:
|
||||||
|
// manque le type ici, on met None en attendant
|
||||||
| LET i=located(identifier) EQUAL e=located(expression) {
|
| LET i=located(identifier) EQUAL e=located(expression) {
|
||||||
SimpleValue(i, None, e)
|
SimpleValue(i, None, e)
|
||||||
}(*
|
}
|
||||||
| LET i=located(identifier) DPOINT ts=located(type_scheme) EQUAL e=located(expression){
|
/* // marche pas
|
||||||
SimpleValue(i,ts,e)
|
| LET i=located(identifier) DPOINT ts=located(type_scheme) EQUAL e=located(expression) {
|
||||||
}*)
|
SimpleValue(i,ts,e)
|
||||||
(* marche pas*)
|
} */
|
||||||
|
/* fun : int f a = 1 */
|
||||||
| FUN f=fundef {
|
| FUN f=fundef {
|
||||||
RecFunctions([f])
|
RecFunctions([f])
|
||||||
}
|
}
|
||||||
(*fun : int f a = 1*)
|
|
||||||
|
|
||||||
(* de même*)
|
|
||||||
|
/* de même */
|
||||||
fundef:
|
fundef:
|
||||||
|(*ts est temp*) i=located(identifier) p=pattern EQUAL e=located(expression){
|
/* ts est temp */
|
||||||
FunctionDefinition(p,e)
|
| i=located(identifier) p=pattern EQUAL e=located(expression) {
|
||||||
}
|
FunctionDefinition(p, e)
|
||||||
|(*ts est temp*) DPOINT ts=located(type_scheme) i=located(identifier) p=pattern EQUAL e=located(expression){
|
}
|
||||||
FunctionDefinition(p,e)
|
/* ts est temp */
|
||||||
}
|
| DPOINT ts=located(type_scheme) i=located(identifier) p=pattern EQUAL e=located(expression) {
|
||||||
|
FunctionDefinition(p, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pattern:
|
pattern:
|
||||||
| i=located(identifier){
|
| i=located(identifier) {
|
||||||
PVariable i
|
PVariable i
|
||||||
}
|
}
|
||||||
| WILDCARD {
|
| WILDCARD {
|
||||||
PWildcard
|
PWildcard
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ty:
|
ty:
|
||||||
| tc = type_constructor{
|
| tc = type_constructor {
|
||||||
TyCon(tc,None)
|
TyCon(tc, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
(* Todo version avec l'optionnel*)
|
(* Todo version avec l'optionnel*)
|
||||||
|
| ty1=located(ty) ARROW ty2=located(ty) {
|
||||||
| ty1=located(ty) ARROW ty2=located(ty){
|
TyArrow(ty1, ty2)
|
||||||
TyArrow(ty1,ty2)
|
|
||||||
}
|
|
||||||
| ty1=located(ty) STAR ty2=located(ty){
|
|
||||||
TyTuple([ty1;ty2])
|
|
||||||
}
|
|
||||||
| ty1=located(ty) STAR ty2= located(ty) STAR liste_ty = separated_list(STAR,located(ty)){
|
|
||||||
TyTuple(ty1::ty2::liste_ty)
|
|
||||||
}
|
|
||||||
| LPAREN type_var=type_variable RPAREN {
|
|
||||||
TyVar type_var
|
|
||||||
}
|
|
||||||
|
|
||||||
type_scheme:
|
|
||||||
(* il faut peut être modifié le séparateur*)
|
|
||||||
| LBRACK liste_typevar = separated_list(COMMA,located(type_variable)) RBRACK ty=located(ty){
|
|
||||||
ForallTy(liste_typevar,ty)
|
|
||||||
}
|
}
|
||||||
| ty=located(ty){
|
| ty1=located(ty) STAR ty2=located(ty) {
|
||||||
ForallTy([],ty)
|
TyTuple([ty1; ty2])
|
||||||
|
}
|
||||||
|
| ty1=located(ty) STAR ty2=located(ty) STAR liste_ty = separated_list(STAR,located(ty)) {
|
||||||
|
TyTuple(ty1::ty2::liste_ty)
|
||||||
|
}
|
||||||
|
| LPAREN type_var=type_variable RPAREN {
|
||||||
|
TyVar type_var
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type_scheme:
|
||||||
|
(* il faut peut être modifié le séparateur*)
|
||||||
|
| LBRACK liste_typevar=separated_list(COMMA,located(type_variable)) RBRACK ty=located(ty) {
|
||||||
|
ForallTy(liste_typevar, ty)
|
||||||
|
}
|
||||||
|
| ty=located(ty) {
|
||||||
|
ForallTy([], ty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type_variable:
|
type_variable:
|
||||||
| tid=TID {
|
| tid=TID {
|
||||||
TId tid
|
TId tid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type_constructor:
|
type_constructor:
|
||||||
| tcon = TID {
|
| tcon = TID {
|
||||||
TCon tcon
|
TCon tcon
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
expression:
|
expression:
|
||||||
|
@ -106,16 +109,19 @@ expression:
|
||||||
Literal l
|
Literal l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
literal:
|
literal:
|
||||||
| i=INT {
|
| i=INT {
|
||||||
LInt i
|
LInt i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
identifier:
|
identifier:
|
||||||
| i=ID {
|
| i=ID {
|
||||||
Id i
|
Id i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
%inline located(X): x=X {
|
%inline located(X): x=X {
|
||||||
Position.with_poss $startpos $endpos x
|
Position.with_poss $startpos $endpos x
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue