Ich suche nach einer klaren Definition dessen, was ein "Tokenizer", "Parser" und "Lexer" sind und wie sie miteinander zusammenhängen (z. B. verwendet ein Parser einen Tokenizer oder umgekehrt)? Ich muss ein Programm erstellen, das c / h-Quelldateien durchläuft, um Datendeklarationen und Definitionen zu extrahieren.
Ich habe nach Beispielen gesucht und kann einige Informationen finden, aber ich habe wirklich Mühe, die zugrunde liegenden Konzepte wie Grammatikregeln, Analysebäume und abstrakten Syntaxbaum zu verstehen und wie sie miteinander zusammenhängen. Letztendlich müssen diese Konzepte in einem tatsächlichen Programm gespeichert werden, aber 1) wie sehen sie aus, 2) gibt es gemeinsame Implementierungen.
Ich habe mir Wikipedia zu diesen Themen und Programmen wie Lex und Yacc angesehen, aber da ich noch nie eine Compiler-Klasse (EE-Major) durchlaufen habe, fällt es mir schwer, vollständig zu verstehen, was los ist.
Beispiel:
Ein Lexer oder Tokeniser teilt dies in Token 'int', 'x', '=', '1', ';' auf.
Ein Parser nimmt diese Token und verwendet sie, um auf irgendeine Weise zu verstehen:
quelle
Ich würde sagen, dass ein Lexer und ein Tokenizer im Grunde dasselbe sind und dass sie den Text in seine Bestandteile (die 'Token') zerschlagen. Der Parser interpretiert dann die Token mithilfe einer Grammatik.
Ich würde mich jedoch nicht zu sehr auf die genaue terminologische Verwendung einlassen - die Leute verwenden oft "Parsing", um eine Aktion zum Interpretieren eines Textklumpens zu beschreiben.
quelle
( Hinzufügen zu den gegebenen Antworten )
quelle