lexer.mll
{
open Parser;;        (* The type token is defined in parser.mli *)
exception Eof;;
exception Illegal;;
}
rule token = parse
    [' ' '\t' '\n']
                   { token lexbuf }     (* skip blanks *)
  | "var"          { VAR }
  | "alloc"        { ALLOC }
  | "false"        { BOOL false }
  | "true"         { BOOL true }
  | "read"         { READ }
  | "write"        { WRITE }
  | "writeln"      { WRITELN }
  | "array"        { ARRAY }
  | "of"           { OF }
  | "do"           { DO }
  | "begin"        { BEGIN }
  | "end"          { END }
  | "if"           { IF }
  | "then"         { THEN }
  | "else"         { ELSE }
  | "while"        { WHILE }
  | "type"         { TYPE }
  | "function"     { FUNCTION }
  | "procedure"    { PROCEDURE }
  | "integer"      { INTEGER }
  | "boolean"      { BOOLEAN }
  | "program"      { PROGRAM }
  | '"' ( [^ '"' ] | "\\\"" ) * '"'
                   { STRING (Lexing.lexeme lexbuf) }
  | ['A'-'Z''a'-'z'] + ['0'-'9'] * ''' *
                   { IDENT (Lexing.lexeme lexbuf) }
  | ['0'-'9']+     { INT(int_of_string (Lexing.lexeme lexbuf)) }
  | ";;"           { SEMISEMI }
  | ":="           { COLONEQUAL }
  | "<>"           { LESSGREATER }
  | "<="           { LESSEQUAL }
  | ">="           { GREATEREQUAL }
  | '<'            { LESS }
  | '>'            { GREATER }
  | ";"            { SEMI }
  | ","            { COMMA }
  | ':'            { COLON }
  | '='            { EQUAL }
  | '-'            { MINUS }
  | '+'            { PLUS }
  | '*'            { TIMES }
  | '/'            { DIV }
  | '('            { LPAREN }
  | ')'            { RPAREN }
  | '['            { LBRACKET }
  | ']'            { RBRACKET }
  | eof            { raise Eof }
  | _              { raise Illegal }