如何检索规则在Xtext中没有直接访问权限的节点?

时间:2012-09-04 12:12:00

标签: xtext

以下是示例规则(只需将其替换为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_ruleinteger,我想在assignment规则中同时使用这两个规则。但是,Xtext只能让我引用一个规则,name功能只能引用规则的一个名称实例,而不是像示例中那样引用同一规则中的多个名称实例。我真的需要这两个规则的信息,但我只能参考其中一个。

1 个答案:

答案 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];

我希望,这样做很有帮助 - 或者如果我误解了你的问题,请澄清一下,我会尝试更新我的答案。