为什么这些终端符号不是独立的?

问题描述 投票:0回答:1

我用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",那么它就会被划上红色的底线。我不能解释我。我想允许任何动词,因此任何单词在开头都是小写的。

java eclipse xtext xtend
1个回答
0
投票

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

原因是词法器将输入变成了独立于解析器的标记流。解析器只是消耗词法器生成的标记。它不会向词法器请求特定类型的标记,词法器也不会根据解析器现在需要的类型而生成不同的标记。相反,词典器按照以下逻辑生成令牌。

从源代码中当前位置能够匹配的所有终端规则中,选择产生最长匹配的规则。如果出现平局,则选择语法文件中最先定义的那条。因此,给定输入 beschreiben,两者 VERBNOTSEPERABLE 会产生相同长度的匹配,所以...。NOTSEPERABLE 胜出,因为它是先定义的。

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

Verb: NOTSEPERABLE | VERB;
© www.soinside.com 2019 - 2024. All rights reserved.