-
Założenia programu
- Program zczytuje kod w języku Python i konwertuje go na język Javascript zapisany w pliku wynikowym
- Rodzaj translatora: kompilator (przekształca od razu cały kod)
- Wynik działania programu:
- Poprawny kod: wypisanie drzewa z tokenami i regułami oraz zapisanie przetworzonego kodu w pliku wynikowym
- Niepoprawny kod: wypisanie komunikatu błędu wraz ze wskazaniem błędnego fragmentu kodu
- Język implementacji: Python 3.13.0
- Generator skanera/parsera: Lark (1.2.2)
-
Gramatyka
- Format: EBNF
- Link do gramatyki
-
Generator skanera/parsera: Lark (1.2.2)
-
Generator kodu: dostosowany do gramatyki Transformer pochodzący z biblioteki Lark
Program potrafi przetworzyć podstawowe instrukcje jak:
- standardowe przypisanie
- operacje matematyczne (łącznie z
//oraz**) - operacje matematyczne z przypisaniem (np.
+=) - operacje logiczne (np.
or) - pętle
whileorazfor(lista, słownik, range) - keywoardy takie jak
breakczycontinue - definicje i wywołanie funkcji wraz z argumentami
- deklaracje list i słowników
- notacje
słownik["atrybut"] - notacje
lista[0] - dodawanie do listy
lista.append(element) - konwersja na int oraz float:
int(),float() len()print()
Generator jest w stanie przekształcić instrukcję for i in range(2, 10, 2) na for w stylu C++ a więc for (let i = 2, i < 10, i += 2). Mimo to na początku pliku wynikowego generator dodaje napisane w Javascript funkcje range() oraz len() działające analogicznie do tych w Python. Można je zobaczyć w jednym z przykładów poniżej.
- instalacja wymaganych bibliotek:
pip install -r requirements.txt - użycie programu:
py main.py [ścieżka do pliku z kodem Pythona, który chcemy przetworzyć] - przetworzony kod znajduje się w pliku
output.js - do uruchomienia pliku wynikowego potrzebne będzie zainstalowane środowisko Node.js
- uruchomienie pliku wynikowego:
node output.js - testy:
py test.py
Dla pos_2.py:
my_list = []
for i in range(5):
my_list.append(i * 3)
for elem in my_list:
print(elem)Drzewo wyprowadzenia (w konsoli):
Tree:
start
assign_stmt
assign
assign_target my_list
expr
atom_expr
atom
list_expr
for_stmt
for
i
in
expr
atom_expr
func_call
atom_expr
atom range
arguments
expr 5
block
expr
atom_expr
func_call
atom_expr
dot_access
atom_expr
atom my_list
append
arguments
mul
expr
atom_expr
atom i
expr 3
for_stmt
for
elem
in
expr
atom_expr
atom my_list
block
expr
atom_expr
func_call
atom_expr
atom print
arguments
expr
atom_expr
atom elemPlik wynikowy output.js
let range = (start, stop, step) => {
if (stop === undefined) {
stop = start;
start = 0;
}
if (step === undefined)
step = 1;
else if (step == 0)
throw new Error("step cannot be 0");
if ((step > 0 && start >= stop) || (step < 0 && start <= stop))
return [];
let result = [];
for (let i = start; step > 0 ? i < stop : i > stop; i += step)
result.push(i);
return result;
}
let len = (obj) => {
if (typeof obj === "string" || Array.isArray(obj))
return obj.length
if (typeof obj === "object")
return Object.keys(obj).length
return 0
}
// user code
let my_list = [];
for (let i = 0; i < 5; i++) {
my_list.push((i * 3))
}
for (let elem of my_list) {
console.log(elem)
}Dla neg_1.py
a = 3
b = "abc"
break = 3Unexpected token: =
In line 3, column 7
break = 3
^
Expected one of the following:
{'_NEWLINE', 'SEMICOLON'}
Sorry, couldn't parse .\examples\negative\neg_1.py