問題
Entry
: temp += (Expression | Declaration | UserType)*
;
Declaration
: Type '*' name=ID ';'
;
Expression
: temp1 = Primary ('*' temp2 += Primary)* ';'
;
Primary
: temp1 = INT
| temp2 = [Declaration]
;
Type
: temp1 = SimpleType
| temp2 = [UserType]
;
SimpleType
: 'int' | 'long'
;
UserType
: 'typedef' name=ID ';'
;
ルールDeclaration
とExpression
は、両方のルールがまったく同じ構文を共有しているためにあいまいであり、相互参照[Declaration]
と[UserType]
ターミナルルールに基づいているために問題が発生しますID
。
したがって、上記の文法のコードを生成すると、ANTLR警告がスローされます。
Decision can match input such as "RULE_ID '*' RULE_ID ';'"
using multiple alternatives: 1, 2
ゴール
最初に相互参照を解決できたルールを選択してほしい。
次のように想定します。
typedef x;
int* x;
int* b;
のAST
x*b
次のようになります。
x = Entry -> Expression -> Primary (temp1) -> [Declaration] -> Stop!
* = Entry -> Expression -> Primary '*' -> Stop!
b = Entry -> Expression -> Primary (temp2) -> [Declaration] -> Stop!
したがって
Entry -> Declaration
なぜなら、決して考慮されるべきではないからです。
Entry -> Expression -> [Declaration]
相互参照をすでに検証できます[Declaration]
。
質問
Xtextにはセマンティック述語がないため(または私は間違っていますか?)、相互参照を検証し、その検証に基づいてそのルールを明示的に選択する方法はありますか?
PS:すでにご存知の方もいらっしゃるかもしれませんが、この問題は、Xtextで実装しようとしているC言語に起因しています。