我想创建一个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。