我已经创建了语法。但是,当我解析下面的文字有问题。我哪里错了? 问候, 弗拉基米尔
语法代码。
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
答案 0 :(得分:0)
有关Terminal Rules的文档告诉您:
请注意,终结规则的顺序对于您的语法至关重要,因为它们可能会相互影响。这对于与已使用的语法导入的规则相关的新引入的规则尤为重要。
因此,VAR_SPECIAL
的终结规则有效:
terminal VAR_SPECIAL:
('`'|','|'\\'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';') ('`'|','|'\\'|'*'|'+'|'!'|'^'|'<%' VAR_NAME '>'|';')*;
由于20480
部分,VAR_NAME
被INT
检测到。
此文本将解析但没有“普通”VAR_NAME
:
MaxMemoryMegs=<%20480>
因此,文档继续:
几乎在任何情况下都建议使用数据类型规则。假设您要添加规则以允许除简单ID之外的完全限定名称。由于只有一个段的限定名称看起来像普通ID,因此应将其实现为数据类型规则,而不是添加其他终端规则。同样的经验法则也适用于浮点文字。
所以我猜你应该重构你的语法,使用“普通”规则而不是终端规则。
除此之外,我认为你应该将VAR_NAME
和VAR_SPECIAL
分开 - 他们看起来像某种表达方式。或者-:-42
是否真的是有效的名称? Dito的价值。