1

私は xtext を学ぼうとしていますが、ANY_OTHER が完全に混乱していて、それについていくつか質問があります。

私の .xtext ファイルには 1 つのプロダクションしかありません。

document: text = '<' ANY_OTHER* '>';

これを「Eclipse アプリケーション」として実行すると、次の入力が正しく機能します。

<>
< >
<.>
<....>
<.. ..>

しかし、以下は失敗しているようです:

<a>

エラー余分な入力 'a' が '>' を期待しています。

Q1) ANY_OTHER がリテラル '.' に一致する理由 キャラクター?

ANY_OTHER をオーバーライドしてみました

terminal ANY_OTHER: .;

これはCommon Terminals hereの元の定義と同じだと思います。

これで、動作が変わります。入力エラーなくなっている。しかし、私が試してみると

<aa>

、無関係な入力 'aa' が '>' を期待してエラーを返します。

Q2) ANY_OTHER をオーバーライドすると動作が変わるのはなぜですか?

Q3) なぜ「.」'a' とは異なる扱いですか? <..> は受け入れられますが、受け入れられません。

4

1 に答える 1

2

ここでは意味があるので、3 つの質問に 1 つの回答でお答えします。

デフォルトでは、文法の最初の行は次のようになります

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

手動で変更しない限り。あなたのはまだこのように見えると思います。これは、独自の文法がデフォルトで org.eclipse.xtext.common.Terminals を使用することを意味するので、その通りです。ANY_OTHER は「共通」文法で指定されます。

指定されたルールに従って: シングル . 1 文字に一致します。このルールに加えて、「共通」文法に ID ルールがあり、すべてのテキスト文字とその他の文字に一致します。ここで重要なのは、ID ルール自体に数量が含まれているのに対し、ANY_OTHER ルールは 1 文字のみに一致することです。したがって、デフォルトでは、ルールはこれらの例に一致します

A   --> 1 instance of ID
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 2 instances of ID, 1 instance of ANY_OTHER

ANY_OTHER ルールをオーバーライドすると、解析順序が変更されます。これに関する情報は、ドキュメントに記載されています。これにより、異なる動作が発生します。

A   --> 1 instance of ANY_OTHER
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 3 instances of ANY_OTHER

この情報がお役に立てば幸いです。

于 2013-03-24T09:16:56.270 に答える