2013-08-23 13 views
5

Ich bin der Umsetzung Python Grammatik in AnTLR4 aber ich bin vor dem gleichen Problem mit SPIEGELSTRICH und Dedent diskutiert hier: ANTLR4- dynamically inject tokenAnTLR4: SPIEGELSTRICH und Dedent Token

Die Lösung, die ich versucht bin, ist die Lösung von Ter zu konvertieren, das sein kann hier gefunden http://antlr3.org/grammar/1078018002577/python.tar.gz (override nextToken und imaginäre Token einfügen).

Das Problem ist, dass diese Lösung geht davon aus, dass wir eine Lexer Regel haben wie:

LEADING_WS 
    : {getColumn()==1}? 
     // match spaces or tabs, tracking indentation count 
     ( ' ' { spaces++; } 
     | '\t' { spaces += 8; spaces -= (spaces % 8); } 
     | '\014' // formfeed is ok 
     )+ 
     { 
     } 
     ... 

aber ich halte einen Fehler bekommen, weil Aktionen in Lexer Regel letztes Element auf einzelne altermost Alternative sein muss.

kann mir jemand helfen, eine lösung zu finden?

Vielen Dank !!!

+1

Sorry für die schamlose Werbung, aber ich hatte das gleiche Problem und beschlossen, eine Hilfsklasse für sie zu schreiben: [antlr-DGeben] (https://github.com/yshavit/antlr-denter). – yshavit

Antwort

3

Sie müssen Ihre Berechnung mit spaces entweder an das Ende der LEADING_WS Regel oder Ihre Implementierung von nextToken verschieben. Am Ende von LEADING_WS könnte es wie folgt aussehen.

LEADING_WS 
    : {getColumn()==1}? 
    // match spaces or tabs, tracking indentation count 
    [ \t]+ 
    {spaces = computeSpaces(_input.getText());} 
    ; 
+0

Danke für Ihre Antwort. Ich versuche die Lösung, es auf die überarbeitete Implementierung von nextToken zu setzen! – pinker

+0

Aus Neugier habe ich die Lösung getestet, die Sie vorschlagen, aber ich bekomme, dass $ Text in Lexer Aktionen nicht erlaubt ist! Benutze ich es richtig? – pinker

+0

@pinker sorry darüber, Sie müssen '_input.getText()' anstelle von '$ text' in ANTLR 4 verwenden. –