我目前正在尝试创建一个类似于以下内容的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'
答案 0 :(得分:0)
您的规则ObjectField和EnumField匹配相同的令牌规则:ID。 您必须将2个引用合并为一个引用,请查看此示例:
Type:
PrimitiveField | ReferenceField
;
ReferenceField:
type=[EntityOrEnum]
;
EntityOrEnum:
Entity | Enum
;
现在,referenceField可以链接到Entity或Enum,您的测试示例也可以。