Mentions légales du service

Skip to content
Snippets Groups Projects
lexer.mll 1.49 KiB
Newer Older
{ open Parser

  exception LexerError of string * Lexing.position * Lexing.position
 }

let non_zero_digit = ['1'-'9']
let digit = '0' | non_zero_digit
let num = digit | non_zero_digit digit*
let integer = '-'? num

let low_alpha = ['a'-'z']
let up_alpha = ['A'-'Z']
let alpha = low_alpha | up_alpha
let alphanum = alpha | num
let identifier = '_'* low_alpha (alphanum | '_')*

let whitespace = ('\t' | ' ')+
let newline = '\n' | "\r\n"
let not_newline = ([^'\n'] # ['\r']) | ('\r' [^'\n'])

let single_line_comment = "//" not_newline* newline

rule lexer = parse
| newline | single_line_comment
{ Lexing.new_line lexbuf; lexer lexbuf }
| whitespace { lexer lexbuf }
| '+'     { PLUS }
| '-'     { MINUS }
| '/'     { SLASH }
| '*'     { TIMES }
| '('     { LPAR }
| ')'     { RPAR }
| ';'     { SEMI }
| '{'     { LBRACE }
| '}'     { RBRACE }
| "skip"  { SKIP }
| "while" { WHILE }
MONTAGU Benoit's avatar
MONTAGU Benoit committed
| "done"  { DONE }
| "do"    { DO }
| "if"    { IF }
| "then"  { THEN }
| "else"  { ELSE }
| ';'     { SEMI }
| ":="    { COLONEQ }
| "true"  { BOOL true }
| "false" { BOOL false }
| "<>"    { LANGLERANGLE }
| '='     { EQ }
| "<="    { LANGLEEQ }
| '<'     { LANGLE }
| ">="    { RANGLEEQ }
| '>'     { RANGLE }
| "&&"    { AMP2 }
| "||"    { VBAR2 }
| "def"   { DEF }
| ','     { COMMA }
| "return" { RETURN }
| identifier { VAR (Lexing.lexeme lexbuf) }
| integer { INT (int_of_string (Lexing.lexeme lexbuf)) }
| eof     { EOF }
| _       { raise (LexerError (Lexing.lexeme lexbuf, Lexing.lexeme_start_p lexbuf, Lexing.lexeme_end_p lexbuf)) }