2016-10-11 16 views
0

私は文法を作成しました。しかし、私は次のテキストを解析するときに問題があります。どこが間違っている? よろしく、 ウラジミール予期しないxtext解析エラー

文法コード。

grammar com.idc.xtext.ConfigLang with org.eclipse.xtext.common.Terminals 

generate configLang "http://www.idc.com/xtext/ConfigLang" 

ConfigLangModel hidden(NEW_LINE): 
    configItems+=ConfigItem*; 

ConfigItem hidden(WS): 
    configItemName=VAR_NAME EQUAL configItemValue=VAR_SPECIAL NEW_LINE; 

terminal VAR_NAME: 
    ('a'..'z'|'A'..'Z'|'_'|'-'|':'|INT|'.')+; 

terminal VAR_SPECIAL: 
    (VAR_NAME|'`'|','|'\\'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';') (VAR_NAME|'`'|','|'\\'|'*'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';')*; 

terminal SL_COMMENT: '#' !('\n'|'\r')* ('\r'? '\n')?; 

terminal NEW_LINE:('\n'|'\r\n')+; 

terminal EQUAL:'='; 

terminal ID: 
    ANY_OTHER; // Hide the default definition 

DSLコード

# $Id: BACKFILL_FIX_MARKETDATA_PORT.config 199954 2015-05-26 16:04:10Z spollard $ 
MaxMemoryMegs=20480 
Dist=idc_apps_full_20150520_199490.jar 

エラーメッセージ

不一致入力 '20480' RULE_VAR_SPECIAL期待 - 不一致の入力 を '\ n' をRULE_EQUAL

答えて

0

についてのドキュメントを期待Terminal Rules

端末規則の順序は、お互いに影ができるので、文法には重要です。これは、使用された文法からインポートされたルールに関連して新しく導入されたルールにとって特に重要です。原因INT部分にVAR_NAMEとして検出

terminal VAR_SPECIAL: 
    ('`'|','|'\\'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';') ('`'|','|'\\'|'*'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';')*; 

そして20480イスト:

だから VAR_SPECIALのためのあなたの端末のルールを効果的この です。

このテキストはVAR_NAME「プレーン」としか解析しないだろう:

MaxMemoryMegs=<%20480> 

は、そのためのドキュメントは、と続き:

それはほとんどどのような場合に代わりにデータ型のルールを使用することをお勧めします。単純なIDに加えて完全修飾名を許可するルールを追加するとします。 1つのセグメントのみを持つ修飾名はプレーンIDのように見えるので、別のターミナルルールを追加するのではなく、データ型ルールとして実装する必要があります。同じ経験則が浮動小数点リテラルにも適用されます。

だから、あなたはターミナルルールの代わりに "普通の"ルールを使うように文法をリファクタリングするべきだと思います。

これ以外にも、VAR_NAMEVAR_SPECIALの両方に分割する必要があると思います。それらは疑いのように何らかの表現のように見えます。または、実際に有効なの名前-:-42のようなものですか?ディートの価値。

関連する問題