按位置的Xtext引用,没有单一的声明点

时间:2015-09-10 15:16:29

标签: grammar dsl xtext

我想创建一个dsl来定义一个属性语法。以下是我在dsl中编写的语法规范示例:

RootSymbol -> AdditiveValue {
  impl = {
    1.calc
    "out " 1.result;
  }
}
AdditiveValue -> AdditiveValue "+" Number {
  result = #0
  calc = {
    1.calc
    3.calc
    "add " 0.result " " 1.result " " 3.result;
  }
}
AdditiveValue -> AdditiveValue "-" Number {
  result = #0
  calc = {
    1.calc
    3.calc
    "sub " 0.result " " 1.result " " 3.result;
  }
}
AdditiveValue -> Number {
  result = 1.result
  calc = 1.calc
}
Number -> "0|[1-9][0-9]*" {
  result = #0
  calc = {
    "set " 0.result " " 1.value;
  }
}

输入:

100 + 42 - 63 + 55

输出:

set 0 100
set 1 42
add 2 0 1
set 3 63
sub 4 2 3
set 5 55
add 6 4 5
out 6

说明:

语法由三个非终端符号组成:

  • RootSymbol有一条规则
  • AdditiveValue有三条规则可以派生出类似上面输入的作品
  • Number有一条规则映射到匹配单个数字的正则表达式

此外,语法规范定义了如何将输入转换为输出,因此Number只输出 set 命令,AdditiveValue输出两者的输出运算符然后添加 sub 命令,RootSymbol输出其AdditiveValue的输出,然后输出命令。

现在,我想为这个dsl​​定义一个Xtext语法,并有以下两个问题:

问题1

如何拆分标识符的声明?在上面的示例中,我有三个符号AdditiveValue的规则。我知道,如果我有一个声明符号的地方,我可以在Xtext中轻松实现。但是,在我的dsl中,我有多个地方来声明一个符号,因为我需要能够为每个符号声明多个规则。

问题2

如何根据位置引用符号?在上面的示例(第二个规则)中,表达式1.calc应该引用周围规则生成的第一部分的calc属性。为清楚起见,它应该引用AdditiveValue符号的calc属性。

感谢任何帮助!

更新

确保理解Xtext中的语法规范与使用我的dsl的语法规范之间的区别。它们是两个不同的东西:我想在Xtext中定义一个与我的dsl中编写的语法规范相匹配的语法。我想这样做只是为了我的dsl有一个编辑器,而不是使用Xtext作为代码生成器。外部编译器程序使用我的dsl中编写的语法将输入转换为输出。另外,我的dsl中编写的上面的示例语法就是:我的dsl的一个简单示例。语法可能要复杂得多Context-free language

0 个答案:

没有答案