summary refs log tree commit diff
path: root/source/mod_student/lexer.mll
diff options
context:
space:
mode:
Diffstat (limited to 'source/mod_student/lexer.mll')
-rw-r--r--source/mod_student/lexer.mll27
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 }