在我的语法中,我有变量和对象(对象只是一个名称(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
答案 0 :(得分:0)
使用Xtext无法做到这一点。您必须在引用属性xor或object属性之前或之后添加至少一个标记。我建议s.th.比如new
:
Content:
INT
| reference=[Declaration]
| 'new' object=ID
;
现在,解析器可以决定ID创建新对象还是对其他声明的交叉引用。