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.
Könnten Sie die ANTLR-Grammatik posten, an der Sie gearbeitet haben? –
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. –
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. –