open BatPrintf open Batteries open Utils let string_of_position pos = let open Lexing in Printf.sprintf "%s:%d:%d" pos.pos_fname pos.pos_lnum (pos.pos_cnum - pos.pos_bol + 1) type token = | SYM_EOF | SYM_IDENTIFIER of string | SYM_INTEGER of int | SYM_VOID | SYM_CHAR | SYM_INT | SYM_STRUCT | SYM_SEMICOLON | SYM_POINT | SYM_IF | SYM_ELSE | SYM_PLUS | SYM_MINUS | SYM_ASTERISK | SYM_DIV | SYM_EQUALITY | SYM_ASSIGN | SYM_LPARENTHESIS | SYM_RPARENTHESIS | SYM_LBRACE | SYM_RBRACE | SYM_WHILE | SYM_RETURN | SYM_COMMA | SYM_LT | SYM_LEQ | SYM_GT | SYM_GEQ | SYM_NOTEQ | SYM_MOD | SYM_BOOL_NOT | SYM_BOOL_AND | SYM_BOOL_OR | SYM_ARROW | SYM_BITWISE_OR | SYM_BITWISE_AND | SYM_BIT_NOT | SYM_XOR | SYM_CHARACTER of char | SYM_STRING of string | SYM_LBRACKET | SYM_RBRACKET | SYM_ALLOC | SYM_PRINT | SYM_EXTERN | SYM_INCLUDE of string let string_of_symbol = function | SYM_EOF -> "SYM_EOF" | SYM_IDENTIFIER(s) -> Printf.sprintf "SYM_IDENTIFIER(%s)" s | SYM_INTEGER(i) -> Printf.sprintf "SYM_INTEGER(%d)" i | SYM_VOID -> "SYM_VOID" | SYM_CHAR -> "SYM_CHAR" | SYM_INT -> "SYM_INT" | SYM_STRUCT -> "SYM_STRUCT" | SYM_SEMICOLON -> "SYM_SEMICOLON" | SYM_POINT -> "SYM_POINT" | SYM_IF -> "SYM_IF" | SYM_ELSE -> "SYM_ELSE" | SYM_PLUS -> "SYM_PLUS" | SYM_MINUS -> "SYM_MINUS" | SYM_ASTERISK -> "SYM_ASTERISK" | SYM_DIV -> "SYM_DIV" | SYM_EQUALITY -> "SYM_EQUALITY" | SYM_ASSIGN -> "SYM_ASSIGN" | SYM_LPARENTHESIS -> "SYM_LPARENTHESIS" | SYM_RPARENTHESIS -> "SYM_RPARENTHESIS" | SYM_LBRACE -> "SYM_LBRACE" | SYM_RBRACE -> "SYM_RBRACE" | SYM_WHILE -> "SYM_WHILE" | SYM_RETURN -> "SYM_RETURN" | SYM_COMMA -> "SYM_COMMA" | SYM_LT -> "SYM_LT" | SYM_LEQ -> "SYM_LEQ" | SYM_GT -> "SYM_GT" | SYM_GEQ -> "SYM_GEQ" | SYM_NOTEQ -> "SYM_NOTEQ" | SYM_MOD -> "SYM_MOD" | SYM_BOOL_NOT -> "SYM_BOOL_NOT" | SYM_BOOL_AND -> "SYM_BOOL_AND" | SYM_BOOL_OR -> "SYM_BOOL_OR" | SYM_ARROW -> "SYM_ARROW" | SYM_BITWISE_OR -> "SYM_BITWISE_OR" | SYM_BITWISE_AND -> "SYM_BITWISE_AND" | SYM_BIT_NOT -> "SYM_BIT_NOT" | SYM_XOR -> "SYM_XOR" | SYM_CHARACTER(c) -> Printf.sprintf "SYM_CHARACTER(%c)" c | SYM_STRING(s) -> Printf.sprintf "SYM_STRING(%s)" s | SYM_LBRACKET -> "SYM_LBRACKET" | SYM_RBRACKET -> "SYM_RBRACKET" | SYM_ALLOC -> "SYM_ALLOC" | SYM_PRINT -> "SYM_PRINT" | SYM_EXTERN -> "SYM_EXTERN" | SYM_INCLUDE(s) -> Printf.sprintf "SYM_INCLUDE(%s)" s