【问题标题】:Xtext: Cross-References with AlternativeXtext:与替代的交叉引用
【发布时间】:2013-01-21 23:25:37
【问题描述】:

我已经开始了我的第一个 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 交叉引用时,它可以工作:

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

谁知道问题出在哪里?

【问题讨论】:

    标签: xtext cross-reference


    【解决方案1】:

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

    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 中没有类型可以同时是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

    【讨论】:

    • 如果我们将DataTypeReference 中的DataTypeEnum 替换为ID 会怎样?我正在尝试实现自定义交叉引用,如果定义了某些内容,则链接到它;否则将其设置为ID
    • @xi.lin:那种形式是行不通的;因为没有对象可以是 ID 或对象。我认为可能的是创建一些可以通过 ID 引用的类型,并创建一些可以替换您的非用户定义 ID 值的默认值(可通过自定义范围提供程序获得)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多