diff options
author | Alex Auvolat <alex.auvolat@ansys.com> | 2014-06-11 16:41:43 +0200 |
---|---|---|
committer | Alex Auvolat <alex.auvolat@ansys.com> | 2014-06-11 16:41:43 +0200 |
commit | 36f98d819756ada119e696729e40d8e8e427b5f0 (patch) | |
tree | cacac900a6923e68911756c335f0dfaa61fcfba5 /frontend/lexer.mll | |
download | scade-analyzer-36f98d819756ada119e696729e40d8e8e427b5f0.tar.gz scade-analyzer-36f98d819756ada119e696729e40d8e8e427b5f0.zip |
Initial commit: parser for tiny subset of SCADE language...
Diffstat (limited to 'frontend/lexer.mll')
-rw-r--r-- | frontend/lexer.mll | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/frontend/lexer.mll b/frontend/lexer.mll new file mode 100644 index 0000000..9d6c208 --- /dev/null +++ b/frontend/lexer.mll @@ -0,0 +1,105 @@ +{ + open Lexing + open Ast + open Parser + + let kwd_table = Hashtbl.create 10 + let () = + List.iter (fun (a, b) -> Hashtbl.add kwd_table a b) + [ + "bool", BOOL; + "int", INT; + "real", REAL; + + "const", CONST; + "node", NODE; + "returns", RETURNS; + "var", VAR; + "let", LET; + "tel", TEL; + + "if", IF; + "then", THEN; + "else", ELSE; + "pre", PRE; + "not", NOT; + "and", AND; + "or", OR; + "mod", MOD; + + "true", TRUE; + "false", FALSE; + + "assume", ASSUME; + "guarantee",GUARANTEE; + "probe", PROBE; + ] + +} + + +(* special character classes *) +let space = [' ' '\t' '\r']+ +let newline = "\n" | "\r" | "\r\n" + +(* utilities *) +let digit = ['0'-'9'] +let digit_ = ['0'-'9' '_'] + +(* integers *) +let int_dec = digit digit_* +let int_bin = ("0b" | "0B") ['0'-'1'] ['0'-'1' '_']* +let int_oct = ("0o" | "0O") ['0'-'7'] ['0'-'7' '_']* +let int_hex = ("0x" | "0X") ['0'-'9' 'a'-'f' 'A'-'F'] ['0'-'9' 'a'-'f' 'A'-'F' '_']* +let const_int = int_bin | int_oct | int_dec | int_hex + +(* tokens *) +rule token = parse + +(* identifier (TOK_id) or reserved keyword *) +| ['a'-'z' 'A'-'Z' '_'] ['a'-'z' 'A'-'Z' '0'-'9' '_']* as id +{ try Hashtbl.find kwd_table id with Not_found -> IDENT id } + +(* symbols *) +| "(" { LPAREN } +| ")" { RPAREN } +| "{" { LCURLY } +| "}" { RCURLY } +| "*" { STAR } +| "+" { PLUS } +| "-" { MINUS } +| "!" { EXCLAIM } +| "/" { DIVIDE } +| "%" { PERCENT } +| "<" { LESS } +| ">" { GREATER } +| "<=" { LESS_EQUAL } +| ">=" { GREATER_EQUAL } +| "==" { EQUAL_EQUAL } +| "<>" { DIFF } +| "&&" { AND_AND } +| "||" { BAR_BAR } +| ";" { SEMICOLON } +| ":" { COLON } +| "," { COMMA } +| "=" { EQUAL } +| "->" { ARROW } + +(* literals *) +| const_int as c { INTVAL c } + +(* spaces, comments *) +| "(*" { comment lexbuf; token lexbuf } +| "--" [^ '\n' '\r']* { token lexbuf } +| newline { new_line lexbuf; token lexbuf } +| space { token lexbuf } + +(* end of files *) +| eof { EOF } + + +(* nested comments (handled recursively) *) +and comment = parse +| "*)" { () } +| [^ '\n' '\r'] { comment lexbuf } +| newline { new_line lexbuf; comment lexbuf } |