私はXtextに新しく、次の問題に直面しています: すべての "error id:"行の下にはスペース/タブを含むすべての印刷可能な文字を期待できます。私の言葉はインデントに基づいているので、この「端末」は空白文字で始めることはできません。Xtextターミナルオーバーラップ
編集/:この言語の 例のコードは次のようになります。私は、この言語仕様に取得
package somepkg:
error UNKNOWN:
Unknown error.
error ZERO_DIVISION:
Do not divide by zero you {0} donkey!.
最寄のはこれです:
grammar com.example.lang.ermsglang.Ermsglang with org.eclipse.xtext.xbase.Xbase hidden(WS)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate ermsglang "http://www.example.com/lang/ermsglang/Ermsglang"
Model:
{Model}
'package' name=ENAME ':'
(BEGIN
(expressions+=Error)+
END)?
;
Error:
{Error}
'error' name=ENAME ':'
(BEGIN
(expressions+=Anything)+
END)?
;
Anything:
(ENAME|EMSG|INT)
;
//Terminals must be disjunctive
terminal ENAME:
('_'|'A'..'Z') ('_'|'A'..'Z')*
;
terminal EMSG:
('!'..'/'|':'..'@'|'['..'~')+
;
terminal SL_COMMENT:
'#' !('\n'|'\r')* ('\r'? '\n')?
;
// The following synthetic tokens are used for the indentation-aware blocks
terminal BEGIN: 'synthetic:BEGIN'; // increase indentation
terminal END: 'synthetic:END'; // decrease indentation
しかし、それでもまだ、これはENAMEかのどちらかができますEMSGまたはINT端子を使用しているため、数字などの文字と混在することはできません。問題の端末は、私はこのようなルール「ANYTHING」を修正するので、もし選言する必要がある。
terminal ANYTHING:
(ENAME|EMSG|INT)+
;
または
Anything:
(ENAME|EMSG|INT)+
;
はあるどの端末を判別することはできませんレクサー/パーサに問題になります。どのようにこの状況に対処するには?ありがとう。
//編集:作業たとえば、キリスト教に感謝し、SL_COMMENTの一つの問題がまだある、この例では2番目のエラーキーワードがメッセージ「エラー」
でRULE_ENDを逃しで強調表示されますXBaseと継承なぜ
package A : error B : a #bopsa Akfkfndsfio error A_C_S : :aasdasdasd
作品または任意の他の端末。レキシングはコンテクストフリーなので、レクサーレベルを明確にする必要があります。 xbaseから継承した場合は、多くのターミナルルールを継承します。 –
@ChristianDietrichそれがなければ、特別端末: 端末BEGIN: 'synthetic:BEGIN'; //インデントを増やす ' '端末END: '合成:END'; //インデントを減らす ' は機能しません。レキシングは文脈自由ですが、言語そのものはありません。これは、インデントの深さのコンテキストに依存します。 – Smarty77
そのバグを報告できますか?あなたが継承している場合は、ID、INTなどをAllStuff Ruleに追加するか、モデル内で決して発生しないようなものにオーバーライドする必要があります。 '' '' @@@@@@@@@@@ INT @@@@@@@@@@@ ''' –