Cały projekt wraz z tym opisem znajduje się na stronie (https://github.com/andrzejgorski/pascalis)
Za pomocą poleceń make gramma
, oraz make test
można zbudować i przetestować cały projekt.
Zostały do projektu dostawione 2 pliki napisane w pythonie, które służą pomocy w pisaniu:
add_exps.py
- program do wygenerowanej przez bnfc gramatyki dodaje część kodu do pliku AbsPascalis.hs, którego nie udało mi się wstawić poprzez gramatykę. (nie jest to ładne rozwiązanie)run_tests.py
- program uruchamia każdy plik z folderu tests jako program napisany w języku pascalis. w pliku znajduje się duży słownik, który mówi jaki output powinien być wypisany dla każdego testu.
Część testów wymaga podania inputu, który jest podawany w plików w folderze inputs.
Co Zostało zrobione:
//Dla każdego z punktów dopiszę nazwy testów znajdujących sie w katalogu tests, które pokazują działanie danej rzeczy w programie.
- typ int (program)
- zimenne typu int (test_decl_int, test_eq_var_int, test_variables_strange)
- if (test_if, test_if_false, test_if_el, test_if_el_false)
- while (test_while)
- wyrażenia z arytmetyką + - */ () (test_x_plus_1, test_x_minus_1, test_10_minus_1)
- Porównowanie intów (test_eq_int_*, test_lt_*, test_gt_*, test_le_*, test_ge_*, test_neq_*)
- funkcje i procedury z parametrami przez wartość i zmeinną z rekurencją. (test_function_recursive*, test_procedure_*)
- drugi typ wyrażeń (bool) (test_decl_bool)
- arytmetyka (porównań boolowskich) (test_eq_int, test_eq_int_false, test_neq_int, test_neq_int_false, test_eq_bool*(4), test_bool*(4), test_and_*(4), test_or_*(4), test_bool_not)
-- 3. o while if else już napisałem
-- 4. Funckje i procedury już wspomniałem
- instrukcja print umiejąca wypisywać stringi, chary, boole, tablice (tylko pełne) (test_decl*, test_array_write)
- a) dwa sposoby przekazywania parametrów do funkcji i procedur. (test_procedure_*, test_function_*) b) pętla for jak w pascalu (test_loop_for) c) typ String. (test_eq_string_true, test_string_*, test_decl_str, test_change_string_content, test_change_one_letter_string, test_sub_str_var) (miały być 2 z 4, a jest 3)
- przesłanianie indentyfikatorów (test_block_variables, test_global_variables)
- (brak) Statycznego typowania
- Jawnie obsłużone dynamiczne błędy wykonania (nieotestowane, nie przerywają działania programu, niewielka część błędów)
- Funkcje zwracające wartość (test_function_return_0)
- b) tablice int -> int (test_array_construct) (test_dict_*) c) słowniki int -> int (2 z 5)
- Dowolne zagnieżdżanie definicji funkcji / procedur z zachowaniem poprawności statycznego wiązania indentyfikatorów (test_function_declaration_in_function)
- ..h) operacje na stringach s[:], s[e:], s[:e], s[e1:e2] - na wzór pythonowych list. (test_python_str_*)
- funkcja lege() (read) która wczytuje i rozpoznaje z wejścia typy int string i char. (test_lege*)
- funkcja ord() char -> int (test_char_ord)
- funkcja longitudo() (length) (test_array_length)
- zmienne typu char wraz całą arytmetyką porównań (test_eq_char_false, test_eq_char_true, test_decl_char)
- Deklaracje jako instrukcje (test_stmt_decl)
- framework do testów napisany w pythonie
Interpreter umie rozpoznawać tylko poprawne programy.
Dla niepoprawnych programów zachowanie jest niezdefiniowane.
Nie wypisuje na standardowe wyjście błędów komunikatów o błędach.
Brak przykładowych niepoprawnych programów.