Ich habe ein bisschen Mühe, manuell ein Token mit einer Lexer-Regel in ANTLR zu emittieren. Ich weiß, dass die emit()-Funktion verwendet werden muss, aber es scheint ein deutlicher Mangel an Dokumentation über diese zu sein. Hat jemand ein gutes Beispiel dafür, wie man das macht?
Das ANTLR-Buch gibt ein gutes Beispiel dafür, wie Sie dies tun müssen, um Pythons Verschachtelung zu analysieren. Wenn Sie zum Beispiel eine bestimmte Menge an Leerzeichen sehen, die größer ist als die Leerzeichen in der vorherigen Zeile, geben Sie ein INDENT-Token aus, aber wenn es weniger ist, geben Sie ein DEDENT-Token aus. Leider geht das Buch nicht auf die eigentliche Syntax ein, die erforderlich ist.
EDIT: Hier ist ein Beispiel für das, was ich zu analysieren versuche. Es sind die verschachtelten Blockquotes von Markdown:
before blockquote
> text1
>
> > text2
>
> text3
outside blockquote
Mein bisheriger Ansatz besteht im Wesentlichen darin, die > Symbole pro Zeile zu zählen. Zum Beispiel scheint die obige Zeile (ungefähr...) PARAGRAPH_START, CDATA, PARAGRAPH_END, BQUOTE_START, CDATA, BQUOTE_START, CDATA, BQUOTE_END, CDATA, BQUOTE_END, PARAGRAPH_START, CDATA, PARAGRAPH_END auszugeben. Die Schwierigkeit hier ist das abschließende BQUOTE_END, das meiner Meinung nach ein imaginäres Token sein sollte, das ausgegeben wird, sobald ein Nicht-Blockquote-Element gefunden wird (und die Verschachtelungsebene >= 1 ist)