Xtext消歧
Xtext disambiguation
给定以下语法:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Program:
{Range} ID '.' '.' ID
| {Group} ID ID ID ID
;
terminal ID:
'a' | '.'
;
和以下输入:
a . . a
我认为有两种方法可以解析字符串:作为 Range
(第一种选择)或作为 Group
(第二种选择)。当我在生成的 IDE 中尝试此操作并检查 Ecore 模型时,实例化了 Range
。
是什么让 Xtext 决定支持 Range
?
编辑: 具体来说,我想知道为什么 Xtext grammar 本身没有歧义,因为范围 'a'..'z'
可以解析为 Group
of Keyword, Wildcard, Wildcard, Keyword
或 CharacterRange
of Keyword, Keyword
.
关键字成为 Lexer 规则的好方法。因此你有两个 Lexer Rules
terminal FULL_STOP_KEYWORD: '.' ;
和
terminal ID: 'a' | '.';
词法分析器不是有状态的。只有一个规则可以获胜。因此 '。'将始终作为关键字进行词法分析,绝不会作为 ID
给定以下语法:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Program:
{Range} ID '.' '.' ID
| {Group} ID ID ID ID
;
terminal ID:
'a' | '.'
;
和以下输入:
a . . a
我认为有两种方法可以解析字符串:作为 Range
(第一种选择)或作为 Group
(第二种选择)。当我在生成的 IDE 中尝试此操作并检查 Ecore 模型时,实例化了 Range
。
是什么让 Xtext 决定支持 Range
?
编辑: 具体来说,我想知道为什么 Xtext grammar 本身没有歧义,因为范围 'a'..'z'
可以解析为 Group
of Keyword, Wildcard, Wildcard, Keyword
或 CharacterRange
of Keyword, Keyword
.
关键字成为 Lexer 规则的好方法。因此你有两个 Lexer Rules
terminal FULL_STOP_KEYWORD: '.' ;
和
terminal ID: 'a' | '.';
词法分析器不是有状态的。只有一个规则可以获胜。因此 '。'将始终作为关键字进行词法分析,绝不会作为 ID