2016-07-25 6 views
0

Ich muss jedem Token absolute Informationen hinzufügen, um ein internes Syntax-Highlight-Framework zu integrieren.javacc Absoluter Offset für specialToken

Ich habe diesen Beitrag gefolgt: http://ramkulkarni.com/blog/capturing-absolute-offsets-for-javaccjjtree-tokens/

Und es funktioniert ok für die regelmäßige Token.

Kommentare werden als spezielle Tokens erfasst und aus irgendeinem Grund wird nicht auf diese angewendet. Ich hace das Problem debuggt und die erzeugte XXTokenManager einen Anruf an CommonTokenAction nach einem fehlenden

if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { 
           matchedToken = jjFillToken(); 
... 

Gibt es eine zusätzliche Markierung I für diesen Satz kann zu arbeiten? Ansonsten kann ich die Datei manuell ändern, aber ich mag es nicht, da es automatisch generiert wird.

Antwort

1

In JavaCC gibt es drei Arten von Token. Übersprungene Token sind für den Parser nicht sichtbar und es wird kein Token Objekt dafür erstellt. Normale Tokens sind für den Parser sichtbar. Spezielle Token sind für den Parser nicht sichtbar, aber Token Objekte sind für sie gemacht. Allgemeine Token-Aktionen werden nur auf normale Token angewendet.

Erste Lösung: Normalerweise, wenn Sie Syntax-Highlighting tun, gibt es keine Notwendigkeit für einen Parser und so keinen Grund für alle Token zu besonderen Tokens. Machen Sie einfach Kommentare und solche wie normale Tokens, damit die allgemeine Token-Aktion auf sie angewendet wird.

Zweite Lösung: Machen Sie alle Token entweder regulär oder speziell. Dann sollte folgendes funktionieren.

public void CommonTokenAction(Token t) 
{ 
    int c = getCurrentTokenAbsolutePosition() + t.image.length(); 
    do { 
     t.absoluteEndColumn = c ; 
     c -= t.image.length() ; 
     t.absoluteBeginColumn = c; 
     t = t.specialToken ; 
    } while(t != null) ; 
}