确定要匹配的规则(Xtext中语义谓词的替代)

时间:2015-06-01 15:31:11

标签: xtext xtend

在我的语法中,我有变量和对象(对象只是一个名称(ID))。现在我希望变量可以是对另一个声明变量或对象的引用 所以我想解析以下输入:

Declaration:
    name = ID "=" Content ";"
;
    Content:
        INT
        | reference = [Declaration]
        | object = ID

我已经实现了这样的目标:

#Loop
while done == False:
    print(room_list[current_room][0])
    choice = input('\nWhere do you want to go? ')
    if int(choice) in room_list[current_room][1:5]:                         
        current_room = int(choice)
    else choice == None:
        print('You can not go that way!')

但解析器无法区分简单ID和声明引用(因为name也是ID)。
有没有办法解决我的问题?
我尝试了语法谓词,但我也可以从我的规则中删除引用或对象,因为解析器只能看到ID而不是引用。在ANTLR中,我会使用语义谓词,但就我所知,它们并不存在于Xtext中。
有没有办法让解析器识别ID是否是引用,然后让它选择ID来匹配引用或对象?

问候Krzmbrzl

1 个答案:

答案 0 :(得分:0)

使用Xtext无法做到这一点。您必须在引用属性xor或object属性之前或之后添加至少一个标记。我建议s.th.比如new

Content:
    INT
    | reference=[Declaration]
    | 'new' object=ID
;

现在,解析器可以决定ID创建新对象还是对其他声明的交叉引用。