我在 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')+;
我只是对所涉及的各种微妙之处有所了解(就像我在这里所做的那样)。
这一次,使用 ANTLR,我想知道是否可以解析输入,例如:
put wood in fire place
即“木头”和“火场”就是上面的游戏对象。但是,“地方”也是“放置”的同义词。所以这同样有效:
place wood in fire place
尝试解析最后一个“地点”令牌时,ANTLR 给了我一个 NoViableAltException。我想将“火场”识别为游戏对象。
那么在ANTLR中这种事情可能吗?语法上可以吗?
另一方面,我正在研究一个手动实现,它使用一个奇怪的自定义数据结构,带有一些 NFA、Dictionary 和诸如此类的东西。但我仍然需要更多时间,并且必须牺牲一些脑细胞来设计所需的搜索和插入算法。
但是如果这在 ANTLR 中是可能的,我可以只使用生成的 C# 文件,是吗?