2012-03-19 11 views
0

大文字の一部として、私は「メソッド呼び出し」を記述するためのルールを定義しようとしています。私は問題に遭遇し、私はターミナルに関する私の知識の欠如に問題を減らしたと思う。Xtextルールは、端末が動作しないことを意味します。

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

Model: methodCalls+=MethodCall*; 
MethodCall: 'call' ID '.' ID; 

その文法では、私は今、私は、メソッド名にワイルドカード文字を許可したい

call variable.method 
call foo.bar 

のようなものを書くことができます。

は、ここに私の問題を説明する簡単な文法です。私は

MethodCall: 'call' ID '.' WildcardName; 

にmethodCallで、ルールを変更し、文法の終わりに、私は、エラーメッセージまし再び

call variable.method 
call foo.bar 

をしようと

terminal WildcardName  : ('a'..'z'|'A'..'Z'|'_'|'*'|'?') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'*'|'?')*; 

を追加しました:

mismatched input 'foo' expecting RULE_ID 
mismatched input 'variable' expecting RULE_ID 

なぜ 'foo'と 'variable'がそうでないのですか端末IDと一致していますか?さらに重要なのは、新しい端末を実際に使用せずに追加しても、なぜこのエラーメッセージが表示されるのでしょうか?

答えて

2

構文解析は、レキシングと解析の2つのステップで行われます。端末ルールはレキシングフェーズで行われます> IDが必要な場所ではワイルドカード名が認識されます =>これにはデータタイプルールも使用する必要があります

WildcardName  : (ID | '*')+; 
関連する問題