解析器编程

时间:2012-02-22 10:20:12

标签: algorithm delphi parsing compiler-construction formula

我想编写一个计算某个输入公式的结果值的包,

由于Shunting-Yard算法(Dijikstra),我创建了解析器, 我想创建允许用户使用的函数库(例如:sin()cos()函数) 然后我想知道我的下一步应该是什么;所以我有一些问题:

  1. 什么更简单易用,分流场算法,或递归下降算法解析公式?

  2. 我会在工作的某个阶段到达口译员的工作吗?

  3. ...谢谢

    请注意我正在使用Delphi编程

2 个答案:

答案 0 :(得分:11)

实现了两者(并且仍然维护两者的系统),这是我的pro / con列表:

  • 调车场:
    • 代码很短
    • 与简单规则/优先级表关联时很容易
    • 在出现问题时烦恼调试
  • 递归下降:
    • 代码更长
    • 当你拥有的只是简单的规则/优先级时更复杂
    • 更容易扩展或添加特殊情况语法
    • 调试相对简单(遵循更“人性”的流程)

或者换句话说,当你只处理数学公式时,Shunting Yard可能是要走的路,但如果你觉得以后可能需要更多的复杂性,递归下降可能更灵活/可扩展/可维护从长远来看,还清。

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

答案 1 :(得分:5)

  

什么更简单的使用,分流场算法,或递归下降算法解析公式?

最简单的是你更了解的那个。如果有一个平局我会用递归下降,它可以用于普通表达式和更复杂的脚本(即:解释器)。

如果这不是家庭作业(因此您不需要自己实施代码),请查看现成的解决方案(例如:dwscriptPascal Script)。您还可以使用“编译器编译器”,这是一个专为生成lexycal分析器和解析器而设计的工具集。我不能推荐任何,因为,说实话,我还没有找到满足我需求的。您可以使用TP Lex/Yacc开始搜索。

  

我会在工作的某个阶段完成翻译的工作,以及如何完成?

解释器通常可以处理脚本并执行多个操作(执行语句)。表达式求值程序仅适用于表达式,提供结果(或可用于获取结果的表达式树)。

解释器肯定需要表达式解析器(或评估器),但不是相反。