2016-03-31 16 views
1

Ich habe die folgende XText-Grammatik, die ANTLR3 unter der Haube verwendet. In meiner Grammatik möchte ich Cast-Ausdrücke wie TYPE(EXPRESSION) und (TYPE)(EXPRESSION) unterstützen. Eine Typdefinition enthält normalerweise andere Typen (ich denke, das ist das Problem, aber ich kann diese Anforderung nicht ändern). Außerdem möchte ich Klammern um Ausdrücke erlauben.Wie rekursive Regelaufruf in Antlr3 zu beheben?

Ist es möglich, die Rekursion durch Links-Factoring zu lösen? Ich bekomme immer die folgende Fehlermeldung.

[fatal] Regel ruleExpression hat nicht-LL (*) Entscheidung aufgrund rekursiver Regelaufrufe von alts 1,2 erreichbar. Auflösen durch Links-Factoring oder Verwenden von syntaktischen Prädikaten oder Verwenden der Option backtrack = true.

Model: 
    e=Expression; 

Expression: 
    e=castExpression | e=parExpression | "VAR"; 

castExpression: 
    (Type | '(' Type ')') e=parExpression; 

parExpression: 
    '(' Expression ')'; 

Type: 
    "MYTYPE" t=Type | "TYPE_ID"; 
+1

@LucasTrzesniewski es ist XText, die ANTLR3 unter der Haube verwendet –

Antwort

0

Die einfachste, aber nicht notwendigerweise der beste Weg, um es Arbeit zu machen, ist in einem syntaktischen Prädikat (=>) im Großen und Ganzen castExpression wie folgt zu setzen:

Expression: 
    =>e=castExpression | e=parExpression | "VAR"; 

Aber es scheint, wie Dies ist ein sehr reduzierter Ausschnitt der eigentlichen Grammatik, daher kann ich nicht sagen, ob es eine brauchbare Lösung im vollen Kontext ist. Beachten Sie außerdem, dass sich eine so lange Vorlaufzeit nachteilig auf die Toolaspekte und die Leistung auswirken kann. Und Sie sollten die Implikationen syntaktischer Prädikate verstehen, bevor Sie weitere hinzufügen.

+0

Danke für Ihre Eingabe, aber ist es möglich, meine Grammatik ohne syntaktische Prädikate zu beschreiben? Ich möchte eine Ausdruckgrammatik mit einem "Cast Operators" wie Typ (Ausdruck) haben. Das Schlüsselproblem besteht darin, dass Klammern um Ausdrücke _und_ types erlaubt werden sollen (weil Typen kompliziert sein können). Ich möchte Ausdrücke wie (type) (expr) oder (type) ((expr) + (expr)) erlauben. – user3625015