2016-04-01 2 views
0

私は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 
+0

作品または任意の他の端末。レキシングはコンテクストフリーなので、レクサーレベルを明確にする必要があります。 xbaseから継承した場合は、多くのターミナルルールを継承します。 –

+0

@ChristianDietrichそれがなければ、特別端末: 端末BEGIN: 'synthetic:BEGIN'; //インデントを増やす ' '端末END: '合成:END'; //インデントを減らす ' は機能しません。レキシングは文脈自由ですが、言語そのものはありません。これは、インデントの深さのコンテキストに依存します。 – Smarty77

+0

そのバグを報告できますか?あなたが継承している場合は、ID、INTなどをAllStuff Ruleに追加するか、モデル内で決して発生しないようなものにオーバーライドする必要があります。 '' '' @@@@@@@@@@@ INT @@@@@@@@@@@ ''' –

答えて

0

follwoing文法は私のために

grammar org.xtext.example.mydsl3.MyDsl hidden (WS, SL_COMMENT) 

generate myDsl "http://www.xtext.org/example/mydsl3/MyDsl" 

import "http://www.eclipse.org/emf/2002/Ecore" as ecore 

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') ('_'|'A'..'Z'|'a'..'z')* 
; 
terminal INT returns ecore::EInt: ('0'..'9')+; 

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 

terminal WS   : (' '|'\t'|'\r'|'\n')+; 

terminal ANY_OTHER: .; 
+0

こんにちは、あなたの答えをありがとう、それはxbaseなしで動作するように見えます。私はあなたの文法の例に従ってそれを実装することができました。私はまだ1つの問題を調査しています(この例でもそうです)。それはエラーの原因となるSL_COMMENTです。たとえば、編集を参照してください。 – Smarty77

+0

問題を解決しました。問題は(この例では)文字範囲 ''!' .. '/''に '#'文字が含まれていましたが、これはもちろんSL_comment端末定義と競合していました。 – Smarty77