【发布时间】:2010-10-02 14:19:11
【问题描述】:
我在 ANTLRWorks 1.4 中有以下语法。我正在尝试在文本冒险游戏创建者中实现解析器的想法,用户将在其中为他的游戏指定各种允许的命令。
grammar test;
parse : cmd EOF;
cmd : putSyn1 gameObject inSyn1 gameObject;
putSyn1 : Put | Place | Drop ;
inSyn1 : In | Into | Within;
gameObject : det obj;
det : The | A | An | ;
obj : Word obj | Word;
Space : (' ' | '\t' | '\r' | '\n'){$channel=HIDDEN;};
Put : 'put';
Place : 'place';
Drop : 'drop';
In : 'in';
Into : 'into';
Within : 'within';
The : 'the';
A : 'a';
An : 'an';
Word : ('a'..'z' | 'A'..'Z')+;
我只是对所涉及的各种微妙之处有所了解(就像我所做的 here)。
这一次,使用 ANTLR,我想知道我是否可以解析输入,例如:
put wood in fire place
即“木头”和“火场”是上面的游戏对象。但是,“地方”也是“放置”的同义词。所以这同样有效:
place wood in fire place
尝试解析最后一个“地点”标记时,ANTLR 给了我一个 NoViableAltException。我想将“火场”识别为游戏对象。
那么这种事情在 ANTLR 中是可能的吗?语法上可以吗?
另一方面,我正在开发一个手动实现,它使用一种奇怪的自定义数据结构,其中包含一些 NFA、Dictionary 和诸如此类的东西。但我仍然需要更多时间,并且必须牺牲一些脑细胞来设计所需的搜索和插入算法。
但如果这在 ANTLR 中是可能的,我可以只使用生成的 C# 文件,是吗?
【问题讨论】:
-
也许你的例子只是一个例子,但是,特别是对于这个例子,你可以使用'fireplace'(一个词)而不是'fire place'
-
嗯,这是一个文字冒险创作者,我希望允许用户在他创建的房间中拥有多字游戏对象。
标签: parsing antlr grammar antlrworks