Xtext:在为3种类型的解析器规则进行交叉引用时编译DSL时出错

时间:2014-07-08 06:52:34

标签: dsl xtext

我目前正在尝试创建一个类似于以下内容的DSL:

    Type:
        PrimitiveField | ObjectField | EnumField
    ;

    PrimitiveField:
        type=PrimitiveType
    ;

    ObjectField:
        type=[Entity]
    ;

    EnumField:
        type=[Enum]
    ;

    enum PrimitiveType: string = 'string' | int = 'int' | float =  'float'

    Entity:
      'entity' name = ID ('extends' superType = [Entity])? '{' 
         props = String ':'type = Type
       '}'
    ;

    Enum:
        'enum' name = ID '{'
            enums += STRING ('And' enums += STRING )*
        '}'
    ;

Entity中的属性应该能够引用创建的所有实体/原语/枚举。但是Xtext无法正确编译。我得到了FileNotFoundException。有人能指出我这种情况的正确方向吗?

以前它没有添加新的' enum'进入DSL definiton。

我尝试了以下方法来解决编译错误:

    Type:
        PrimitiveField | ObjectField | Enum
    ;

    PrimitiveField:
        type=PrimitiveType
    ;

    ObjectField:
        type=[Entity]
    ;

    enum PrimitiveType: string = 'string' | int = 'int' | float =  'float'

    Entity:
      'entity' name = ID ('extends' superType = [Entity])? '{' 
         props = String ':'type = Type
       '}'
    ;

    Enum:
        'enum' name = ID '{'
            enums += STRING ('And' enums += STRING )*
        '}'
    ;

但结果不正确,因为我定义:

    entity teee {
       'aper' : test 
    }

    enum test {
        'dark'
    }

Eclipse给了我错误:无法找到实体' test'

1 个答案:

答案 0 :(得分:0)

您的规则ObjectField和EnumField匹配相同的令牌规则:ID。 您必须将2个引用合并为一个引用,请查看此示例:

Type:
    PrimitiveField | ReferenceField
;

ReferenceField:
    type=[EntityOrEnum]
;

EntityOrEnum:
    Entity | Enum
;

现在,referenceField可以链接到Entity或Enum,您的测试示例也可以。