48 lines
1.2 KiB
OCaml
48 lines
1.2 KiB
OCaml
|
{
|
||
|
open Parser
|
||
|
open Lexing
|
||
|
|
||
|
exception Error of string
|
||
|
}
|
||
|
|
||
|
|
||
|
let digit = ['0'-'9']
|
||
|
let id = ['a'-'z'] ['a'-'z' '0'-'9']*
|
||
|
|
||
|
rule token = parse
|
||
|
| '\n' (* ignore newlines but count them *)
|
||
|
{ new_line lexbuf; token lexbuf }
|
||
|
| [' ' '\t'] (* ignore whitespaces and tabs *)
|
||
|
{ token lexbuf }
|
||
|
| '(' {LeftParenthesisToken}
|
||
|
| ')' {RightParenthesisToken}
|
||
|
| '=' {EqualToken}
|
||
|
| "!=" {DifferentToken}
|
||
|
| '=' {EqualToken}
|
||
|
| '<' {LesserToken}
|
||
|
| '>' {GreaterToken}
|
||
|
| "<=" {LesserEqualToken}
|
||
|
| ">=" {GreaterEqualToken}
|
||
|
| '+' {PlusToken}
|
||
|
| '-' {MinusToken}
|
||
|
| '*' {StarToken}
|
||
|
| '/' {SlashToken}
|
||
|
| "&&" {AndToken}
|
||
|
| "||" {OrToken}
|
||
|
| "->" {BodyToken}
|
||
|
| "fun" {FunctionToken}
|
||
|
| "if" {IfToken}
|
||
|
| "then" {ThenToken}
|
||
|
| "else" {ElseToken}
|
||
|
| "let" {LetToken}
|
||
|
| "in" {InToken}
|
||
|
| "letrec" {RecToken}
|
||
|
| "true" {TrueToken}
|
||
|
| "false" {FalseToken }
|
||
|
| digit+ as inum
|
||
|
{NumberToken (int_of_string inum)}
|
||
|
| id as text
|
||
|
{IdentToken text}
|
||
|
| eof { EOF }
|
||
|
| _ { raise (Error ("Unexpected char: "^(Lexing.lexeme lexbuf))) }
|