diff options
Diffstat (limited to 'source/mod_student/lexer.mll')
-rw-r--r-- | source/mod_student/lexer.mll | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/source/mod_student/lexer.mll b/source/mod_student/lexer.mll index d26912f..2a4b116 100644 --- a/source/mod_student/lexer.mll +++ b/source/mod_student/lexer.mll @@ -32,14 +32,23 @@ let implode l = let unescape str = let rec aux x= match x with - | ['"'] -> [] - | '\\'::'\\'::xs ->'\\'::(aux xs) - | '\\'::'n'::xs ->'\n'::(aux xs) - | '\\'::'"'::xs ->'"'::(aux xs) + | [] -> [] + | '\\'::'\\'::xs -> '\\'::(aux xs) + | '\\'::'n'::xs -> '\n'::(aux xs) + | '\\'::'"'::xs -> '"'::(aux xs) + | '\\'::x::xs -> failwith "unsupported escape sequence" | x::xs ->x::(aux xs) - | [] -> failwith "missing \" in escaped string" - in implode (aux (List.tl (explode str) ) ) ;; + in implode (aux (explode str) ) ;; + let unescape_chr chr = + match (explode chr) with + | '\\'::'\\'::[] -> '\\' + | '\\'::'n' ::[] -> '\n' + | '\\'::'\''::[] -> '\'' + | '\\'::c::_ -> failwith "unsupported escape sequence" + | c::[] ->c + | [] -> failwith "empty char literal" + | _ -> failwith "too long character literal" (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----------------------------------------------------------------------------- *) @@ -52,7 +61,8 @@ let implode l = let identifier = ['a'-'z' '_' 'A' - 'Z']['_' 'A' - 'Z' 'a'-'z' '0'-'9']* let integer = ['0'-'9']+ - let str = "\""(([^ '\n''"''\\'])|('\\'['n''\\''"']))*"\"" + let str = (([^ '\n''"''\\'])|('\\'['n''\\''"']))* + let chr = (([^ '\n' '\'' '\\'])|('\\'['n' '\\' '\''])) (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----------------------------------------------------------------------------- *) @@ -76,7 +86,8 @@ let implode l = (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv * Miejsce na twoje reguĊy *) - | str as e { STRING (unescape e) } + | '"' str as e '"' { STRING (unescape e) } + | "'" (chr as e) "'" { CHAR (unescape_chr e) } | "," { COMMA } | "(" { LPAREN } | ")" { RPAREN } |