【问题标题】:Why are these terminalsymbols not independent?为什么这些终端符号不是独立的?
【发布时间】:2020-06-11 16:43:23
【问题描述】:

我在 Xtext 上玩了一点,在 DSL 编辑器中出现了意想不到的行为。这不是 Xtext 文件的全部内容,但对这个问题很重要。

Title:   
    title= NOUN  VERB ':';
Use:
   'um' NOUN use=Verbtype;

Verbtype: Simpleverb | NotSeperableVerb;

Simpleverb:
    'zu' simpleverb=VERB;

NotSeperableVerb:
    notseperable=NOTSEPERABLE;

terminal NOTSEPERABLE:
    'be'VERB | 'emp'VERB |'ent'VERB | 'er'VERB | 'ge'VERB | 'miss'VERB | 'ver'VERB | 'zer' VERB;

terminal VERB: ('a'..'z')+;

如果我为标题部分写了一个不可分离的动词,例如“beschreiben”,那么它会带有红色下划线。我无法向我解释。我想允许任何动词,因此任何开头都是小写的单词。

【问题讨论】:

  • 能否给出完整的语法和示例模型?除此之外:词法分析器(在 Antlr 中,因此在 Xtext 中)是上下文无关的。因此,如果它可以被解释为 NOTSEPERABLE ,它将会是。可能的解决方案:查看数据类型规则(这是解析器规则,因此是上下文敏感的)

标签: java eclipse xtext xtend


【解决方案1】:

终端符号 NOTSEPERABLEVERB 不是独立的,因为它们重叠(即它们可以匹配一些相同的输入)。终端规则不相互影响的唯一方法是它们不重叠。

这样做的原因是词法分析器将输入转换为独立于解析器的标记流。解析器只是使用词法分析器生成的标记。它不会从词法分析器请求特定类型的标记,并且词法分析器不会根据解析器现在需要的类型生成不同的标记。相反,词法分析器根据以下逻辑生成标记:

从源代码中当前位置可以匹配的所有终端规则中,选择产生最长匹配的一条。在平局的情况下,选择在语法文件中首先定义的那个。所以给定输入beschreibenVERBNOTSEPERABLE 都会产生相同长度的匹配,所以NOTSEPERABLE 获胜,因为它是首先定义的。

如果你想匹配任何一个,你需要定义一个可以匹配任一终端的非终端规则:

Verb: NOTSEPERABLE | VERB;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2012-04-26
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多