我已经开始了我的第一个Xtext项目,我遇到了交叉引用的问题(这就是我认为可能是问题)。我有一个DatType,InterfaceDescription规则和一个Enumeration。我想要做的是通过让用户从枚举中选择一种数据类型或定义一个新的数据类型来描述一个接口。
Enum工作没有问题,但是当我使用“datatype test1”定义一个新的数据类型并在InterfaceDescription中使用它时,我得到以下错误:'XtextReconcilerJob'遇到了问题。在“XtextReconcileJon”期间发生内部错误。这就是错误堆栈:http://pastebin.com/evFki2mB
DataType:
'datatype' name=ID ('mapto' mappedType = JAVAID)?
;
Interface:
interfaceType=InterfaceType name=ID datatype=([DataType]| DataTypeEnum)
;
enum InterfaceType:
INLET = 'inlet' |
OUTLET = 'outlet'
;
DataTypeEnum:
INT8 = 'int8' | INT16 = 'int16' | INT32 = 'int32' |
DOUBLE = 'double' | SINGLE = 'single' | REAL = 'real' |
BOOLEAN = 'boolean' | CHAR = 'char'
;
当我在另一个规则中使用DataType交叉引用时,它可以工作:
ParamList:
'param:' datatype=[DataType] name=ID
;
任何人都知道这是什么问题?
答案 0 :(得分:3)
语法存在一些问题,这些问题共同导致了这种奇怪的行为:
DataTypeEnum
,而不是它的名称不是enum
,而是一个可能代表一些字符串值的奇怪对象。这隐藏了编辑器中接口规则中备用类型赋值的问题。error(208): ../org.xtext.example.mydsl/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl.g:447:1: The following token definitions can never be matched because prior tokens match the same input: RULE_ID
ebnf2 is not supported for CrossReference
- 这意味着,一个扩展的构造,例如'|'定义引用时不允许使用pattern DataTypeEnum
前加enum
关键字作为前缀,数据类型属性定义在编辑器中变得错误,因为EMF中没有可以是enum
和EObject的类型因此问题的位置变得明显。最后,运行时错误是由生成的解析器/词法分析器工具中缺少某些东西引起的,结果模型也是错误的。
为了更具建设性,我建议通过定义TypeReference元素来替换违规行,该元素可以引用映射到Java的类型或数据类型。我可以通过以下方式扩展你的语法:
Interface:
interfaceType=InterfaceType name=ID datatype=(TypeReference)
;
TypeReference:
JavaTypeReference | DataTypeReference
;
JavaTypeReference:
type = [DataType]
;
DataTypeReference:
type = DataTypeEnum
;
enum DataTypeEnum:
INT8 = 'int8' | INT16 = 'int16' | INT32 = 'int32' |
DOUBLE = 'double' | SINGLE = 'single' | REAL = 'real' |
BOOLEAN = 'boolean' | CHAR = 'char'
;
PS:我建议在语言中添加一些关键字以简化解析,尤其是错误恢复。有关详细信息,请参阅以下博文:http://zarnekow.blogspot.hu/2012/11/xtext-corner-7-parser-error-recovery.html