2

問題

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 ';'
;

ルールDeclarationExpressionは、両方のルールがまったく同じ構文を共有しているためにあいまいであり、相互参照[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言語に起因しています。

4

1 に答える 1

0

Xtextの現在のバージョンに関しては、セマンティック述語はサポートされていません。

相互参照はそれらの端末(私の場合は端末)UserRoleに解決されます。そして、リンクプロセス中にのみ参照が検証されます。私の場合、ASTがすでに作成されているので遅すぎます。DeclarationID

状況依存のルール決定を使用する唯一の可能な方法は、構文を示す文法内に抽象的なルールを実際に定義することです。上記の例では、ルールExpressionDeclarationは1つに書き直されます。次に、スコーピングの使用を支援するコンテンツなどの必要な領域でセマンティック検証が行われます。

于 2012-12-12T05:44:24.003 に答える