我已将问题归结为一个非常简单的语法。

Model:
    (greetings+=Greeting* | greetings+=FrGreeting*);

Greeting:
    'Hello' person=ID '!';

FrGreeting:
    'Bonjour' person=('jacques' | 'philippe') '!';

在文件中,您可以用英语或法语问候他人,但不能同时用两种语言问候。我们只知道两个法国人的名字。

问题是你不能用英语和雅克打招呼。
Hello jacques!

结果是 mismatched input 'jacques' expecting RULE_ID 。我很困惑为什么会这样。我将如何修复它?

编辑:
做这样的事情:
Greeting:
    'Hello' person= AllNames '!';

FrGreeting:
    'Bonjour' person=(FrenchNames) '!';

AllNames: ID | FrenchNames ;

FrenchNames: 'jacques' | 'philippe';

修复编译错误问题。但是它会阻止自动完成工作,并且 jacquesphilippe 仍然像关键字一样突出显示(即使编写为 Hello jacques! )。

编辑 2:
这似乎修复了自动完成错误:
Greeting:
    'Hello' person= AllNames '!';

FrGreeting:
    'Bonjour' person=('jacques' | 'philippe') '!';

AllNames: 'jacques' | 'philippe' | ID;

我的问题:
为什么 1 个分支中的字符串常量会改变沿不同代码路径摄取 ID 终端的方式?它是用终端实现的(这似乎与文档相矛盾)?这是一个错误吗?

我编辑的解决方案是实现这一目标的最佳方式吗?

最佳答案

该语法对我来说没有多大意义,但我想(如果我理解正确的话)您可以使用以下内容做您想做的事情:

Model:
  (greetings+=Greeting* | greetings+=FrGreeting*);

Greeting:
  'Hello' person=PersonName '!';

FrGreeting:
  'Bonjour' person=PersonName '!';

PersonName : ID | 'jacques' | 'philippe';

关于parsing - 导致 xtext 中意外类型冲突的字符串常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20253044/

10-13 04:08