From b798ac29c37299b2f761243ae92ab8f7c4c4d7f1 Mon Sep 17 00:00:00 2001 From: Paweł Dybiec Date: Tue, 30 Oct 2018 15:32:56 +0100 Subject: Initial commit --- source/mod_student/lexer.mll | 79 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 source/mod_student/lexer.mll (limited to 'source/mod_student/lexer.mll') diff --git a/source/mod_student/lexer.mll b/source/mod_student/lexer.mll new file mode 100644 index 0000000..4cd656c --- /dev/null +++ b/source/mod_student/lexer.mll @@ -0,0 +1,79 @@ +{ + open Xi_lib + open Parser + open Parser_utils + + (* Lexing z biblioteki standardowej ocamla *) + open Lexing + + (* Standardowo w YACC-podobnych narzędziach to lekser jest uzależniony od parsera. To znaczy, że typ + * danych z tokenami definiuje moduł wygenerowany na bazie grammar.mly. Definiujemy alias na typ + * tokenu na potrzeby interfejsów Xi_lib.Iface *) + type token = Parser.token + + (* Obsługa błędu *) + let handleError pos token = + let exc = InvalidToken (mkLocation pos, token) in + raise exc + + (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + * Miejsce na twój kod w Ocamlu + *) + + + (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ----------------------------------------------------------------------------- *) + + } + + (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + * Miejsce na nazwane wyrażenia regularne + *) + + let identifier = ['a'-'z' '_' 'A' - 'Z']['_' 'A' - 'Z' 'a'-'z' '0'-'9']* + + (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ----------------------------------------------------------------------------- *) + + + rule token = parse + (* Trzeba pamiętać aby uaktualnić pozycje w lexbuf, gdy widzimy znak końca wiersza. + * To się samo nie robi. Moduł Lexing z standardowej biblioteki daje do tego wygodną + * funkcję new_line. + *) + | ['\n'] + { new_line lexbuf; token lexbuf } + + (* widzimy początek komentarza i przechodzimy do pomocniczego stanu *) + | "//" + { line_comment lexbuf } + + | eof + { EOF } + + (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + * Miejsce na twoje reguły + *) + + | identifier as id + { failwith id } + + (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ----------------------------------------------------------------------------- *) + + | _ + { handleError (Lexing.lexeme_start_p lexbuf) (Lexing.lexeme lexbuf) } + + (* Pomocniczy stan aby wygodnie i prawidłowo obsłużyć komentarze *) + and line_comment = parse + | '\n' + { new_line lexbuf; token lexbuf } + + (* Niektóre edytory nie wstawiają znaku końca wiersza w ostatniej linijce, jesteśmy + * przygotowani na obsługę takiego komentarza. + *) + | eof + { EOF } + + | _ + { line_comment lexbuf } -- cgit 1.4.1