Szukam jasnej definicji tego, czym są „tokenizer”, „parser” i „lexer” i jak są one ze sobą powiązane (np. Czy parser używa tokenizera lub odwrotnie)? Muszę utworzyć program, który przejdzie przez pliki źródłowe c / h, aby wyodrębnić deklarację danych i definicje.
Szukałem przykładów i mogę znaleźć trochę informacji, ale naprawdę staram się zrozumieć podstawowe pojęcia, takie jak reguły gramatyczne, drzewa parsowania i abstrakcyjne drzewo składniowe oraz ich wzajemne powiązania. Ostatecznie koncepcje te muszą zostać zapisane w rzeczywistym programie, ale 1) jak one wyglądają, 2) czy istnieją wspólne implementacje.
Patrzyłem na Wikipedię na te tematy i programy, takie jak Lex i Yacc, ale ponieważ nigdy nie przeszedłem przez klasę kompilatora (kierunek EE), trudno mi w pełni zrozumieć, co się dzieje.
Przykład:
Lekser lub tokeniser podzieli to na tokeny „int”, „x”, „=”, „1”, „;”.
Parser weźmie te tokeny i użyje ich do zrozumienia w jakiś sposób:
źródło
Powiedziałbym, że lekser i tokenizer to w zasadzie to samo i rozbijają tekst na części składowe („tokeny”). Następnie parser interpretuje tokeny za pomocą gramatyki.
Nie przejmowałbym się jednak zbytnio precyzyjnym użyciem terminologii - ludzie często używają „parsowania” do opisania jakiejkolwiek czynności polegającej na interpretacji fragmentu tekstu.
źródło
( dodawanie do podanych odpowiedzi )
źródło