Próbuję zrozumieć kompilację i interpretację, krok po kroku, zastanawiając się nad całkowitym obrazem. Podszedłem więc do pytania podczas czytania http://www.cs.man.ac.uk/~pjj/farrell/comp3.html tego artykułu
To mówi :
Kolejny etap kompilatora nosi nazwę Parser. Ta część kompilatora rozumie gramatykę języka. Odpowiada za identyfikację błędów składniowych i tłumaczenie bezbłędnego programu na wewnętrzne struktury danych, które można interpretować lub zapisywać w innym języku.
Ale nie mogłem rozgryźć, w jaki sposób tokenizer może poprawnie tokenizować dany strumień, który zawiera błąd składniowy.
Powinien się tam utknąć lub przekazać parserowi błędne informacje. To znaczy, czy tokenizacja nie jest też rodzajem tłumacza?
Jak więc przezwyciężyć leksykalne, uszkodzone linie kodu podczas tokenizacji.
W powyższym linku znajduje się przykład tokena w nagłówku Tokenizera .
Rozumiem, że forma tokena wygląda na to, że jeśli coś jest nie tak z tokenem kodu, to również zostanie uszkodzony.
Czy mógłbyś wyjaśnić moje nieporozumienie?
and
lub&&
czy coś innego. Jest (głównie) osobny i różni się od parsowania. Optymalizacja (jeśli występuje) jest prawie przypadkowym efektem ubocznym.Którą zwykle oczekiwać większość błędów składni, aby przyjść z parsera, a nie Lexer.
Lexer wygeneruje błąd, jeśli (i głównie tylko wtedy), jeśli na wejściu jest coś, czego nie można tokenizować. Jednak w wielu językach prawie każda sekwencja znaków może być zamieniona na tokeny, więc błędy tutaj są dość niezwykłe.
Analizator składni wygeneruje błąd, jeśli dane wejściowe zawierają prawidłowe tokeny, ale te tokeny nie są ułożone, więc tworzą prawidłowe instrukcje / wyrażenia w języku docelowym. Z reguły jest to o wiele bardziej powszechne.
źródło
Tokenizer dzieli tylko strumień znaków na tokeny. Z tokenizera POV jest to całkowicie poprawne:
i tłumaczy się na coś takiego:
["1", MULTIPLY, MULTIPLY, "1"]
Tylko parser może odrzucić takie wyrażenia - wie, że operator mnożenia nie może podążać za innym operatorem mnożenia. Na przykład w JavaScript daje to:Istnieją błędy, które mogą zostać wykryte przez tokenizer. Dla przykładu: niedokończone literały ciągów znaków
"abc
lub nieprawidłowe numery:0x0abcdefg
. Nadal mogą być zgłaszane jako błędy składniowe:Należy jednak pamiętać, że token nie został rozpoznany i jest zgłaszany jako
ILLEGAL
.źródło