【问题标题】:Unexpected xtext parsing error意外的 xtext 解析错误
【发布时间】:2016-10-11 14:45:10
【问题描述】:

我已经创建了语法。但是,当我解析以下文本时出现问题。我哪里错了? 问候, 弗拉基米尔

语法代码。

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

【问题讨论】:

    标签: xtext


    【解决方案1】:

    关于Terminal Rules的文档告诉你:

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

    所以你对VAR_SPECIAL 的最终规则是实际上是这样的:

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

    由于INT 部分,20480 被检测为VAR_NAME。

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

    MaxMemoryMegs=<%20480>
    

    因此文档继续:

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

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

    除此之外,我认为您应该将VAR_NAME 和VAR_SPECIAL 分开——它们看起来很像某种表达方式。或者像-:-42 这样的东西真的是一个有效的name? Dito 的价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2013-10-11
      • 2023-03-18
      • 2011-09-24
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多