Frage

Ich habe die Grammatik einer Datei wie unten gezeigt zu definieren.

// Beispieldatei
NameCount = 4
Name = a
Name = b
Name = c
Name = d
// Ende der Datei

Jetzt bin ich in der Lage Token zu definieren für NameCount und Namen . Aber ich habe die Dateistruktur, einschließlich der gültigen Anzahl von Instanzen der Token Namen definieren , der der Wert nach ist NameCount . Ich habe den Wert analysiert und in eine ganze Zahl umgewandelt und in einer Variablen im globalen Bereich der Grammatik gespeichert (zB in Variable nc ).

Wie in der Grammatik zu definieren, die Name sollte wiederholen genau nc mal?

War es hilfreich?

Lösung

Das kann nicht in der Grammatik selbst ausgedrückt werden. Wenn die Zahl war fix könnte man die Anzahl der erwarteten Token auszudrücken. Aber die Token Strom ändert basierend auf dem Wert. Was Sie tun können, ist dies in den Lexer / Parser Kombination enthalten. Aber man kann dieses Konstrukt nicht erstellen, indem nur die Ebene Grammatik-Syntax. Sie wollen wahrscheinlich etwas entlang der Linien von

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...

Andere Tipps

Ich bin mir nicht sicher, dass dies eine kontextfreie Grammatik ist. Wenn dies nicht der Fall, kann man nicht sagen, ANTLR die Sprache zu analysieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top