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



我玩了一点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",那么它就是红色下划线。我无法解释。我想允许任何动词因此任何开头小写的单词。

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

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

从源代码中当前位置可以匹配的所有终端规则中,选择产生最长匹配的规则。如果是领带,请选择语法文件中首先定义的领带。所以给定输入beschreibenVERBNOTSEPERABLE都会产生相同长度的匹配,所以NOTSEPERABLE获胜,因为它是首先定义的。

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

Verb: NOTSEPERABLE | VERB;

最新更新