let \
type myint = int \
type arrtype = array of myint \
- var arr1:arrtype :=
+ var arr1:arrtype := \
arrtype [10] of 0 \
in \
arr1 \
let lexbuf = Lexing.from_string code in
let rec tokens () =
match Tiger.Lexer.token lexbuf with
- | Tiger.Parser.Token.EOF -> []
- | token -> token :: tokens ()
+ | None -> []
+ | Some token -> token :: tokens ()
in
tokens ()
print_endline "OK";
with Assert_failure _ ->
let tokens_to_string tokens =
- String.concat "; " (List.map Tiger.Parser.Token.to_string tokens)
+ String.concat "; " (List.map ~f:Tiger.Parser.Token.to_string tokens)
in
printf
"ERROR\n Expected: %s\n Emitted : %s\n\n"
let ic = open_in path_to_program_file in
let lexbuf = Lexing.from_channel ic in
let rec parse_and_print () =
- let token = Tiger.Lexer.token lexbuf in
- printf "%s\n" (Tiger.Parser.Token.to_string token);
- match token with
- | Tiger.Parser.Token.EOF -> ()
- | _ -> parse_and_print ()
+ match Tiger.Lexer.token lexbuf with
+ | None ->
+ ()
+ | Some token ->
+ printf "%s\n" (Tiger.Parser.Token.to_string token);
+ parse_and_print ()
in
parse_and_print ();
close_in ic;
-val token : Lexing.lexbuf -> Tiger_parser.Token.t
+val token : Lexing.lexbuf -> Tiger_parser.Token.t option
rule token = parse
| eof {
- EOF
+ None
}
(* Track line number *)
comment lexbuf
}
- | ":=" {ASSIGN}
- | "<=" {LE}
- | ">=" {GE}
- | "<>" {NEQ}
- | '&' {AND}
- | '(' {LPAREN}
- | ')' {RPAREN}
- | '*' {TIMES}
- | '+' {PLUS}
- | '-' {MINUS}
- | '/' {DIVIDE}
- | ',' {COMMA}
- | '.' {DOT}
- | ':' {COLON}
- | ';' {SEMICOLON}
- | '>' {GT}
- | '<' {LT}
- | '=' {EQ}
- | '[' {LBRACK}
- | ']' {RBRACK}
- | '{' {LBRACE}
- | '}' {RBRACE}
- | '|' {OR}
+ | ":=" {Some ASSIGN}
+ | "<=" {Some LE}
+ | ">=" {Some GE}
+ | "<>" {Some NEQ}
+ | '&' {Some AND}
+ | '(' {Some LPAREN}
+ | ')' {Some RPAREN}
+ | '*' {Some TIMES}
+ | '+' {Some PLUS}
+ | '-' {Some MINUS}
+ | '/' {Some DIVIDE}
+ | ',' {Some COMMA}
+ | '.' {Some DOT}
+ | ':' {Some COLON}
+ | ';' {Some SEMICOLON}
+ | '>' {Some GT}
+ | '<' {Some LT}
+ | '=' {Some EQ}
+ | '[' {Some LBRACK}
+ | ']' {Some RBRACK}
+ | '{' {Some LBRACE}
+ | '}' {Some RBRACE}
+ | '|' {Some OR}
(* String literal *)
| '"' {
}
| (num+ as int) {
- INT (int_of_string int)
+ Some (INT (int_of_string int))
}
| (alpha (alpha | num | '_')* as id) {
match id with
- | "array" -> ARRAY
- | "break" -> BREAK
- | "do" -> DO
- | "else" -> ELSE
- | "end" -> END
- | "for" -> FOR
- | "function" -> FUNCTION
- | "if" -> IF
- | "in" -> IN
- | "let" -> LET
- | "nil" -> NIL
- | "of" -> OF
- | "then" -> THEN
- | "to" -> TO
- | "type" -> TYPE
- | "var" -> VAR
- | "while" -> WHILE
- | _ -> ID id
+ | "array" -> Some ARRAY
+ | "break" -> Some BREAK
+ | "do" -> Some DO
+ | "else" -> Some ELSE
+ | "end" -> Some END
+ | "for" -> Some FOR
+ | "function" -> Some FUNCTION
+ | "if" -> Some IF
+ | "in" -> Some IN
+ | "let" -> Some LET
+ | "nil" -> Some NIL
+ | "of" -> Some OF
+ | "then" -> Some THEN
+ | "to" -> Some TO
+ | "type" -> Some TYPE
+ | "var" -> Some VAR
+ | "while" -> Some WHILE
+ | _ -> Some (ID id)
}
and string_literal = parse
(* Keep escaped quote marks as part of the string literal *)
| '"' {
let string = Buffer.contents string_buf in
Buffer.reset string_buf;
- STRING string
+ Some (STRING string)
}
and comment = parse
| eof {
(* TODO: Error: unterminated comment? or we don't care? *)
- EOF
+ None
}
(* Track line number *)