summaryrefslogtreecommitdiff
path: root/frontend/lexer.mll
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ansys.com>2014-06-11 16:41:43 +0200
committerAlex Auvolat <alex.auvolat@ansys.com>2014-06-11 16:41:43 +0200
commit36f98d819756ada119e696729e40d8e8e427b5f0 (patch)
treecacac900a6923e68911756c335f0dfaa61fcfba5 /frontend/lexer.mll
downloadscade-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.mll105
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 }