java - 为什么这些终端符号不是独立的?
问题描述
我玩了一点 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”,那么它会带有红色下划线。我无法向我解释。我想允许任何动词,因此任何开头都是小写的单词。
解决方案
终端符号NOTSEPERABLE
和VERB
不是独立的,因为它们重叠(即它们可以匹配一些相同的输入)。终端规则不相互影响的唯一方法是它们不重叠。
原因是词法分析器将输入转换为独立于解析器的标记流。解析器只是使用词法分析器生成的标记。它不会从词法分析器请求特定类型的标记,并且词法分析器不会根据解析器现在需要的类型生成不同的标记。相反,词法分析器根据以下逻辑生成标记:
从源代码中当前位置可以匹配的所有终端规则中,选择产生最长匹配的一条。在平局的情况下,选择在语法文件中首先定义的那个。所以给定 input beschreiben
,两者VERB
和NOTSEPERABLE
都会产生相同长度的匹配,所以NOTSEPERABLE
获胜,因为它是首先定义的。
如果要匹配任一终端,则需要定义一个可以匹配任一终端的非终端规则:
Verb: NOTSEPERABLE | VERB;
推荐阅读
- yaml - git-secret-reveal 在 github 操作上失败
- firebase - 使用 Firebase 时出现 Flutter Stackoverflow 错误
- c++ - 基于策略的设计 - 处理多种类型的理想方式,例如将它们存储在容器中、迭代等
- c# - 为叠加层创建后台应用程序
- symfony - Symfony 5:在树枝模板中添加集合
- elixir - Elixir:更新地图列表
- ms-word - Word 查找和替换:搜索任何月份
- javascript - Javascript单击事件触发在C#的控制台中打印
- python-3.x - 将字典转换为 Pandas 数据框
- pari - pari gp函数编程中的指针可选参数