我已将问题归结为一个非常简单的语法。
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';
修复编译错误问题。但是它会阻止自动完成工作,并且
jacques
和 philippe
仍然像关键字一样突出显示(即使编写为 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/