2017-06-13 12 views
1

Ich bin neu in ANTLR. Ich habe gerade entdeckt, dass es möglich ist, jede Alternative in einer Produktion zu beschriften wie so:Warum benötigt ANTLR alle oder keine Alternativen?

foo 
    : a # aLabel 
    | b # bLabel 
    | // ... 
    ; 

Allerdings finde ich es unangenehm, dass alle oder keine Alternativen gekennzeichnet werden muss. Ich musste vor kurzem nur zwei Alternativen einer Produktion mit mehr als 20 Filialen beschriften, und ich beschriftete schließlich alle anderen # stubLabel. Gibt es einen Grund, warum alle oder keine etikettiert werden müssen?

Antwort

3

Sobald Sie ein Label ANTLR4 hinzufügen, werden nicht mehr Kontextklasse für diese Regel erzeugen, sondern einzelne Kontextklassen für jeden alt. Dies kann nicht gemischt werden (z. B. mit einem Kontext für die gesamte Regel und gleichzeitig Kontexten für nur einige der Alternativen). Sobald Sie mit der Verwendung von Labels beginnen und der Regelkontext nicht mehr generiert wird, müssen Sie Kontexte für alle Alternativen generieren oder etwas fehlt.

1

OK, ich glaube, ich habe das herausgefunden. Vermutlich um Platz zu sparen, wird der jedem Label entsprechende Knoten von dem der Produktion entsprechenden Knoten subklassifiziert, anstatt ein Kind davon zu sein.

expression 
    : // ... 
    | foo # namedMethodInvocation 
    ; 

wird