作为我大学课程的一部分,我必须使用XText构建一个简单的DSL。目前我遇到静态类型检查的问题。让我们假设我的语言有两种类型的变量,即圆形和三角形。 两者都有自己的一组参数,例如半径或高度/宽度。但是,两者都有共同的参数,如x / y(位置)。因此,我必须遵循xtext代码:
//CircleAttributesInit makes sure, that the correct parameter are used
CircleDecl:
'circle' name = ID '(' (attributes += CircleAttributesInit)* ')'
;
//triangleAttributesInit makes sure, that the correct parameter are used
TriangleDecl:
'triangle' name = ID '(' (attributes += triangleAttributesInit)* ')'
;
CircleAccess returns INT:
circle = [CircleDecl] '.' ('radius')
;
TriangleAccess returns INT:
triangle = [TriangleDecl] '.' ('height' | 'width')
;
ObjectDecl:
name = (CircleDecl | TriangleDecl)
;
ObjectAccess returns INT:
objName = [ObjectDecl] '.' ('x' | 'y')
;
在我的简单程序中,我现在可以输入类似的内容:
triangle tri (...)
circle c (...)
tri.height = ...
c.radius = ...
但访问超类型变量,如:
tri.x = ....
c.y =....
不起作用。错误消息是:“无法解析对ObjectDecl'tri / c'的引用。” 这种方式对我来说很有意义,因为我从未告诉过xtext,每个TriangleDecl / CircleDecl对象也是一个ObjectDecl。但是我该怎么做呢?
答案 0 :(得分:0)
看起来你混淆了一些元级别。只要属性仅存在于语法级别,您就必须自己照顾