2017-11-09 3 views
0

Ich versuche, einen Parser für eine begrenzte Anzahl von YAML Syntax ähnlich wie zu bauen, was unter Verwendung von Antlr 4.7 gezeigt wird:Antlr4 Umgang mit yaml unquoted mehrzeiligen Strings

name: 
    last: Smith 
    first: John 
    address: 
    street: 123 Main St 
      Suite 100 
    city: Boston 
    state: MA 
    zip: 12345 

ich eine Grammatik (abgeleitet von die Python 3-Grammatik), die korrekt funktioniert, wenn ich die "value" -Strings in Anführungszeichen setze, aber nicht, wenn ich sie entferne. Es scheint, dass das Definieren der "Wert" -Strange, so dass die Übereinstimmung endet, vor dem nächsten "tag:" - Teil eines neuen Blocks oder eines "tag:" - Teils einer neuen Zuweisungsanweisung der Trick ist.

Hat jemand irgendwelche Ideen oder Arbeitsproben, die diesen Anwendungsfall behandeln?

Antwort

0

Es ist die Einrückung einer nicht leeren Zeile, die die Übereinstimmung eines einfachen Skalars beenden sollte. Wenn dieser Einzug nicht mehr als der Einzug des aktuellen Mappings ist, endet der Skalar dort.

Zum Beispiel:

mapping: 
    key: value with 
     multiple lines 
    key2: 
    other value 

Hier endet die value with multiple lines an der Linie mit key2:, weil es nicht mehr als der aktuellen Zuordnung (d.h. der Wert von mapping: oben) eingedrückt wird. Natürlich ist das letzte Newline-Zeichen und die Einrückung von key2: kein Teil des Inhalts dieses Skalars.

In der YAML-Spezifikation wird dies durch eine Produktion

s-indent(n) ::= s-space × n 
behandelt wird

nun in unserem Fall hat die innere Zuordnung eine Vertiefung von n=2, so dass Ihr Skalar durch so etwas wie

plain-scalar-part (s-indent(3) s-white* plain-scalar-part)* 
abgestimmt werden würde

(Ich weiß nicht, Antlr-Syntax, nur davon ausgehen, dass diese alle Nicht-Terminals sind). Nach der (möglicherweise leeren) ersten Zeile stimmen Sie mit einer Einrückung überein, die größer als die übergeordnete Zuordnung ist (in diesem Fall also 3 Leerzeichen). Dann kann es noch mehr Leerzeichen geben (die nicht zum Inhalt gehören), und dann folgen weitere Inhalte . Der Einfachheit halber ignorierte ich mögliche Leerzeilen.

Dies stimmt nicht mit der Zeile key2: überein, weil es zu wenige Einrückungen hat, wodurch die Anpassung des Skalars beendet wird.

Jetzt weiß ich nicht, wie man so etwas wie s-indent(n) in Antlr, aber die Python-Grammatik sollte Ihnen die richtigen Zeiger geben.

Verwandte Themen