{ open InfSatParser exception LexError of string let line_no = ref 1 let end_of_previousline = ref 0 } let space = [' ' '\t' '\r'] let newline = ['\n'] let digit = ['0'-'9'] let lower = ['a'-'z'] let upper = ['A'-'Z'] rule token = parse | space+ { token lexbuf } | newline { end_of_previousline := (Lexing.lexeme_end lexbuf); line_no := !line_no+1; token lexbuf} | "(*" { comment lexbuf; token lexbuf } | "Grammar." { BEGING } | "End." { END } | "Terminals." { BEGINT } | "fun" { FUN } | "->" { ARROW } | "(" { LPAR } | ")" { RPAR } | "$" { COUNTED } | "+" { EXISTENTIAL } | "*" { UNIVERSAL } | "." { PERIOD } | digit digit* { let s = Lexing.lexeme lexbuf in INT(int_of_string s)} | lower (digit|lower|upper|'_')* { let s = Lexing.lexeme lexbuf in NAME(s)} | upper (digit|lower|upper|'_')* { let s = Lexing.lexeme lexbuf in NONTERM(s)} | eof { EOF } | _ { Format.eprintf "unknown token %s in line %d, column %d-%d @." (Lexing.lexeme lexbuf) (!line_no) ((Lexing.lexeme_start lexbuf)- (!end_of_previousline)) ((Lexing.lexeme_end lexbuf)-(!end_of_previousline)); failwith "lex error" } and comment = parse | "*)" { () } | "(*" { comment lexbuf; comment lexbuf } | eof { print_string "Lex error: unterminated comment\n"; failwith "unterminated comment" } | _ { comment lexbuf }