2016-07-18 8 views
0

Wenn ich eine Inselgrammatik mit antlr4 bekämpfe und ich es zum Laufen bringen kann, habe ich immer noch Zweifel, ob das der "richtige" Weg ist.ANTLR4: Inselgrammatik, Token matching/skipping

muss ich analysieren:

Some random text 
{ } 

@if(condition) { 
    more random text 
    @foobar 
    @if (condition2) { 
     random text {} 
    } 
} 

Das Problem im Kontext liegt: Ein „wild“ {} nichts ist, aber wenn es eine ist {} hinter einer Sprache Operator, die {} sinnvoll werden . (Sprich: Es öffnet und schließt einen Block)

Im obigen Fall wäre es die folgende Rückkehr, unter der Annahme, dass diese Bedingung und condition2 beide wahr:

Some random text 
{} 
more random text 
random text {} 

Ich bin verwirrt, auf dem Weg zu holen , irgendwelche Ratschläge zu den oben genannten?

Die ursprüngliche Implementierung scheint Klammern passend zu:

{ } 

@if (true) { 
    { 
    foo 
    bar 
    } } 

ergibt

{ } 
{ 
foo 
bar 
} 

während

{ } 

@if (true) { 
{ 
    foo 
    bar 
    } 

ergibt einen Fehler parse.

+0

Könnten Sie die ANTLR-Grammatik posten, an der Sie gearbeitet haben? –

+0

Parser/Lexer sind unter: https://github.com/igmar/rythm2/blob/master/src/main/antlr4/RythmLexer.g4 https://github.com/igmar/rythm2/blob/master /src/main/antlr4/RythmParser.g4 Ich habe die Teile, die sich auf die Frage beziehen, nicht implementiert, da ich immer noch über den richtigen Ansatz nachdenke. –

+0

Um klar zu machen, was ich meine: Der aktuelle Parser schlägt bei {} als Eingabe fehl. Logisch: Es gibt CURLY_OPEN CURLY_CLOSE zurück, was laut Grammatik nicht erlaubt ist. Ich könnte das in einen Modus bringen, der nicht einfach ist, da ich in der Lage sein muss, ihm zu entkommen. Grundsätzlich möchte ich sagen: Match} wenn du ein {zuerst gesehen hast. –

Antwort

0

Dies kann mit einem kontextspezifischen Lexer gelöst werden. In diesem Fall können wir, indem wir die Zustands-/Blocköffnungen verfolgen, feststellen, ob dies Vorlageninhalt ist oder ein tatsächliches Öffnen/Schließen eines Blocks.

Siehe p219 der endgültigen ANTLR4-Referenz ANTLR4.

+0

Es ist noch schlimmer: Text @ foo.bar Text Text @ foo.bar() Text ist auch gültig. –