Dijkstra的算法和功能

时间:2010-06-01 12:43:34

标签: c parsing dijkstra mathematical-expressions shunting-yard

问题是:假设我有一个像BNF指定的sin(2-cos(3*A/B)^2.5)+0.756*(C*D+3-B)输入函数,我将使用递归下降算法解析输入,然后我如何使用或更改Dijkstra算法来处理这个给定的函数?我需要用sin |来执行它cos | sqrt | ln,Dijkstra的算法应该做的工作。

编辑:可能我也应该问:代表给定功能的最佳实践或数据结构是什么?

编辑:输入集可以获取为:

C 0.01 .01 .02 .04 .08 .02 .02 .04 
A .016 .008 .116 .124 .147 .155 .039 .023  
D .012 .025 .05 .1 .1 .1 .025 .012000 .012
B .007 .007 .015 .022 .029 .036 .044 .051 .058 .066 .073 .080 

编辑:Shunting Yard是将输入函数转换为RPN的算法,但是如何将其扩展为接受另一个函数如sin | cos | sqrt | LN?递归下降是否为Shunting Yard提供了必要的扩展?

3 个答案:

答案 0 :(得分:3)

我认为你在谈论Dijkstra的Shunting Yard算法?

为了评估反向抛光符号(分流场的输出),通常使用堆栈。

Shunting Yard被设计为在Algol中进行解析我相信,我相信它应该适用于任何函数(固定或可变数量的参数)。

这是一篇博文,更详细地解释了它:http://www.kallisti.net.nz/blog/2008/02/extension-to-the-shunting-yard-algorithm-to-allow-variable-numbers-of-arguments-to-functions/

答案 1 :(得分:0)

我在这里看不到Dijkstra,因为它用于在非负权重的图中找到最短路径。

在你的情况下,你谈论一个递归下降解析器,它是类型LL(k),它由类似于

的语法定义
expression ::= term + term | term - term
term ::= factor * factor | factor / factor
factor ::= ident | number

number ::= digit | digit number
digit ::= 0 | 1 | 2 ...

存储此类信息的最佳数据结构通常是抽象语法树,它是一个复制其解析的代码结构的树。在您的示例中,您需要为不同的代码片段使用不同的结构或类:BinaryOperationIdentNumberUnaryOperationFunctionCall最终会有某些内容像

                         BinaryOperation +
                          |            |
                                     BinaryOperation *
                                      |            |
                                    Number       BinaryOperation +
                                      |           |
                                     0.756     BinOp *
                                               |    |
                                             Ident Ident
                                               |    |
                                               C    D
编辑:不知道调车场是由Dijkstra发明的!顺便说一下,这是一个非常简单的算法,比如Moron解释的......你永远不会停止学习新东西!

答案 2 :(得分:0)

使用ANTLR语法与Jack提供的语法类似。它应该足以用多种语言创建一个好的解析器:Java / C / C ++ / Python /等。阅读一些示例和教程。您应该使用ANTLRWorks来加快表达式验证。