|
1
3
我已经写了一些这种命令解析风格的pyparsing示例,您可以在以下网站上找到它们: http://pyparsing.wikispaces.com/file/view/simpleBool.py/451074414/simpleBool.py http://pyparsing.wikispaces.com/file/view/eval_arith.py/68273277/eval_arith.py 我还编写了一个简单的冒险风格的游戏处理器,它接受解析的命令结构,并对游戏“世界”执行它们,该游戏充当命令执行器。我在2006年PyCon上展示了这个,但会议页面的链接已经过时了——现在可以在 http://www.ptmcg.com/geo/python/confs/pyCon2006_pres2.html (演示文稿使用S5鼠标右下角查看导航按钮)。代码位于 http://www.ptmcg.com/geo/python/confs/adventureEngine.py.txt ,代码的UML图位于 http://www.ptmcg.com/geo/python/confs/pyparsing_adventure.pdf . 我发现最有效的通用模式类似于旧的模型视图控制器模式。
模型是您的虚拟机,它维护从命令到命令的上下文。在里面
视图是解析器本身。它提取每个命令的片段并组成一个命令类的实例。命令类的接口
然后,Controller是一个简单的循环,它实现了以下伪代码:
如果使用pyparsing实现解析器,则可以将Command类定义为该抽象类的子类:
定义每个命令时,可以直接将相应的子类作为命令表达式的解析操作传递。例如,用于在迷宫中移动的简化GO命令如下所示:
对于上面的抽象Command类,GoCommand类可能如下所示:
通过解析像“GO NORTH”这样的语句,您将得到的不是包含标记“GO”和“NORTH”的ParseResults,而是一个GoCommand实例,其参数包括命名标记“direction”,为GO命令提供方向参数。 因此,设计步骤如下:
|
|
|
2
1
我会这样做:
当然,您可以将整个内容放在一个类中并使其成为一个对象,但您可以看到一般结构。如果您有一个对象,那么您可以继续创建一个可以处理上下文/状态信息的版本。然后,上面的函数将只是成员函数。 为什么我觉得你是在学习Haskell之后才开始使用Python的?通常情况下,人们会走相反的路。在Python中,您可以免费获得状态。你不需要上课。您可以使用类来处理同一程序中的多个状态:)。 |
|
|
tungd · 保留注释并从错误中恢复的解析器 8 年前 |
|
|
Tom · Pyparsing、Python 3和Unicode字节顺序标记 10 年前 |
|
|
Dave · 在pyparsing中使用QuotedString 11 年前 |
|
|
orange · 对上下文执行Pyparsing操作 12 年前 |