0

我已经开始了我的第一个 Xtext 项目,但遇到了交叉引用的问题(我认为这可能是问题所在)。我有一个 DatType、InterfaceDescription 规则和一个枚举。我想做的是通过让用户从枚举中选择一种数据类型或定义一个新的数据类型来描述一个接口。

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 Cross-Reference 时,它​​可以工作:

ParamList:
    'param:' datatype=[DataType] name=ID
;

有谁知道有什么问题?

4

1 回答 1

3

语法有一些问题,共同导致了这种奇怪的行为:

  1. DataTypeEnum,与其名称相反,它不是enum一个奇怪的对象,它可能代表一些字符串值。这隐藏了编辑器中接口规则中的替代类型分配问题。
  2. 生成编辑器时,输出中会出现一些神秘的错误消息:
    • 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- 这意味着,一个扩展的结构,如“|” 定义参考时不允许使用模式
  3. 通过DataTypeEnum使用enum关键字前缀,数据类型属性定义在编辑器中变得错误,因为 EMF 中没有类型可以同时是 anenum和 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

于 2013-01-23T20:21:22.080 回答