以下是示例规则(只需将其替换为MyDsl语法):
Start:
elem += (integer)*
;
int_rule:
'int' (name += integer ('=' values += INT)?) (',' name+=integer ('=' values += INT)?)* ';'
;
/* I have to put the rule name as "integer", so when users hover
* on variable names, they see exactly type "integer". This is a bit
* adhoc, but it's acceptable for the time being. However, using this method
* If some other rules refer to "integer", it can only either retrieve the name
* in this "integer" rule or its
*/
integer:
name = ID
;
/*
* Example: assignment like num1 = 2, num2 = 3.... the variable name of type
* integer can't be referred, since I have to either refer to "int_rule" rule to
* retrieve its value or "integer" to retrieve its name. I can't get both.
*/
assignment:
name = [integer] // or name = [int_rule]
;
我在评论中解释道。基本上,整数规则由两个规则组成:int_rule
和integer
,我想在assignment
规则中同时使用这两个规则。但是,Xtext只能让我引用一个规则,name
功能只能引用规则的一个名称实例,而不是像示例中那样引用同一规则中的多个名称实例。我真的需要这两个规则的信息,但我只能参考其中一个。
答案 0 :(得分:3)
我建议为您的问题设计一个不同的设计:在语法中定义术语变量,参考和值。变量只是一个定义 - 您可以在其中显示可用的类型信息。如果要使用此变量,则必须使用变量引用 - 在评估语言中描述的代码时,必须找到它所引用的变量 - Xtext通过在EMF级别上连接您的引用来帮助实现这一点。最后,值可以是常量和变量引用 - 在语法中相应地使用它们。
作为示例,请查看以下内容(它未在Xtext中进行测试,因此可能存在轻微错误):
Variable:
(type = 'int')? //Optional type definition - you could use any type here
name = ID
('=' initialValue = Value)? //Optional initial declaration;
Value:
Integer | VariableReference;
Integer:
value = int;
VariableReference:
referredVariable = [Variable];
Assignment:
'let' lhs = [VariableReference] '=' rhs = [Value];
我希望,这样做很有帮助 - 或者如果我误解了你的问题,请澄清一下,我会尝试更新我的答案。