0

私は数日前にxtextをいじり始め、チュートリアルを実行しました。たぶん、解決策はどこかのリファレンスでカバーされていますが、私はそれをすぐに正しく理解することはできません。

私の問題はこれです。を混ぜた簡単な文法を書いてみましたorg.eclipse.xtext.common.TerminalsFILE_NAME次に、次のようなcusotmターミナルを挿入したいと思います。

terminal FILE_NAME:
( !('/' | '\\' | ':' | '*' | '?' | '"' | '<' | '>' | '|') )+
;

これは基本的に、Windowsでファイル名に許可されているものです。ただし、これを行うと、ID、INTなどの継承されたルールは、常にカスタム端末の後に生成されるため、一致しなくなります。

そのような問題を優雅に(可能な限り繰り返しをなくし、可能な限り一般的に)回避することはできますか?前もって感謝します!

4

1 に答える 1

0

ターミナルルール(別名レクサールール)は、入力シーケンスをトークン化するために使用されます。私見では、ターミナルルールには最小限のセマンティクスが必要です。

有効なファイル名のみを受け入れる特殊なパーサールールを表現しようとしました。

Xtextドキュメント[1]で説明されているパーサーフェーズを見てください。私のおすすめ:

  1. 字句解析:特殊な端末ルールを使用する代わりに、STRINGを使用します。

  2. 検証:「fileName」EAttributeを使用してEClassの検証ルールを記述します。



可能な限り繰り返しのない、可能な限り一般的な

'fileName'EAttributeを持つすべてのEClassに対して検証を繰り返す必要はありません。洗練されたEcoreモデルがある場合は、「fileName」EAttributeを使用して新しいスーパータイプを導入します。

1つの一般的な検証ルール#check_fileName_is_valid(ElementWithFile)を実装できます。

また、洗練されたMMがない場合は、文法内でメタモデルのヒントを使用してください。一般化されたスーパータイプを提供すると、XtextのEcore推論機能がサブタイプの一般的な機能を引き出します。元:

ElementWithFile: A | B;
A: ... 'file' fileName=STRING ...;
B: ... 'file' fileName=STRING ...;
// => Ecore: ElementWithFile.fileName<EString>



[1] http://www.eclipse.org/Xtext/documentation.html#DSL

于 2012-12-05T09:36:59.930 に答える