意外的xtext解析错误

时间:2016-10-11 14:45:10

标签: 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

错误消息

  

输入不匹配&#39; 20480&#39;期待RULE_VAR_SPECIAL - 输入不匹配   &#39; \ n&#39;期待RULE_EQUAL

1 个答案:

答案 0 :(得分:0)

有关Terminal Rules的文档告诉您:

  

请注意,终结规则的顺序对于您的语法至关重要,因为它们可能会相互影响。这对于与已使用的语法导入的规则相关的新引入的规则尤为重要。

因此,VAR_SPECIAL的终结规则有效

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

由于20480部分,VAR_NAMEINT检测到。

此文本将解析但没有“普通”VAR_NAME

MaxMemoryMegs=<%20480>

因此,文档继续:

  

几乎在任何情况下都建议使用数据类型规则。假设您要添加规则以允许除简单ID之外的完全限定名称。由于只有一个段的限定名称看起来像普通ID,因此应将其实现为数据类型规则,而不是添加其他终端规则。同样的经验法则也适用于浮点文字。

所以我猜你应该重构你的语法,使用“普通”规则而不是终端规则。

除此之外,我认为你应该将VAR_NAMEVAR_SPECIAL分开 - 他们看起来像某种表达方式。或者-:-42是否真的是有效的名称? Dito的价值。