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, KeywordCharacterRange of Keyword, Keyword.

关键字成为 Lexer 规则的好方法。因此你有两个 Lexer Rules

terminal FULL_STOP_KEYWORD: '.' ;

terminal ID: 'a' | '.';

词法分析器不是有状态的。只有一个规则可以获胜。因此 '。'将始终作为关键字进行词法分析,绝不会作为 ID