解析器、解释器编程

3

我希望编写一个软件包,计算给定输入公式的结果值。

我基于Shunting-Yard算法(Dijikstra)创建了解析器,我想创建用户可以使用的函数库(例如:sin()cos()函数)。

那么接下来该怎么做?我有一些问题:

  1. 使用Shunting Yard算法还是递归下降算法更简单易用?

  2. 在我的工作中是否会涉及到解释器的工作?如果会,具体如何实现?

谢谢...

请注意,我正在使用Delphi进行编程。


你可能想尝试一下这个:http://www.pegtop.net/delphi/components/math/download.htm - user497849
[1] - “简单”是什么意思? [2] - 你需要详细说明一下。我们没有你上课的笔记! - Cosmin Prund
不,这不是作业,我已经不在大学了。 - Zeina
我的意思是简单: 使用递归方法编程更简单,或者换句话说,更容易处理我后面要使用的内部函数。 - Zeina
处理内部函数并不是最困难的部分,而且无论你使用哪种解析算法,它都大致相同。如果你喜欢递归实现,那么你可能会更喜欢递归下降算法,因为它本身就是递归的! - Cosmin Prund
2个回答

11

已经实现了两种算法(并且仍在维护着这两种系统),以下是我的优缺点列表:

  • Shunting Yard:
    • 代码简短
    • 当与简单的规则/优先级表关联时易于处理
    • 当出现问题时,调试起来很烦人
  • Recursive Descent:
    • 代码较长
    • 当你只有简单规则/优先级时更复杂
    • 更容易扩展或添加特殊情况的语法
    • 相对较简单的调试(遵循更“人性化”的流程)

换句话说,如果您只处理数学公式,那么Shunting Yard可能是最好的选择;但是,如果您认为以后可能需要更复杂的内容,递归下降可能更灵活、可扩展、可维护,并能够长期回报。

编译器编译器(Lex/Yacc、Flex/Bison等)可能是明显的第三选择,但我不知道任何Delphi的维护实现,而且对于简单的数学公式,它们过于复杂。


5
使用Shunting Yard算法还是递归下降算法来解析公式更简单易用?最简单的方法就是你理解得更好的那个。如果两种方法差不多,我会选择递归下降算法,它可以用于普通表达式和更复杂的脚本(例如:解释器)。如果这不是作业(因此你不需要自己实现代码),可以考虑使用现成的解决方案(例如:dwscriptPascal Script)。你也可以使用“编译器生成器”,这是一套用于生成词法分析器和解析器的工具集。我无法推荐任何一个,因为说实话,我还没有找到一个能满足我的需求的。你可以从TP Lex/Yacc开始搜索。
在我的工作中,我是否会在某个阶段涉及到解释器的工作,以及如何涉及?
解释器通常会在脚本上工作并执行多个操作(执行语句)。表达式求值器仅处理表达式,提供结果(或可用于获取结果的表达式树)。解释器肯定需要表达式解析器(或求值器),但反之则不然。

我可以问一个额外的问题吗? 在执行脚本时,解释器能否执行预定义的脚本?是否可以执行用户定义的非内置函数? - Zeina
我想这是一个“如何”问题,而不是一个“是否”的问题。对于“是否”,答案显然是“是”(Python是一种解释型语言,Python可以完成任何可做的事情)。而“如何”则涉及到你的设计,这绝对是一个过大的主题无法在评论中讨论。请随意提出新问题(右上方的“提问”按钮),并要求实现思路。 - Cosmin Prund
或者只需查看JVCL JvInterpreter,其中包括一个简单的Pascal实现,可以完成这样的事情。 - Warren P
dwscript和PascalScript(我更喜欢PascalScript,但我都用过)都是开源的,大家可以去看看。老实说,对于发帖人来说,如果你需要询问实现细节,那么你可能还没有准备好开始这项任务。除非你只是为了娱乐和爱好而进行(我真心认为设计类似这样的东西很有趣)。 - Cosmin Prund
我该怎么准备才好呢?我正在学习有关 Pascal Script 的更多知识,但它是否与 Delphi 2010 兼容呢?据我所见,它只兼容到 2009 年...其实这是为工作而做的,但我也可以从中感受到快乐。它是否也与 Win7 64位兼容? - Zeina
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接