2011-06-03 90 views
0

我想创建一个类似于S表达式语法的解析类似公式语言的玩具的语法。类似Excel的玩具公式解析

我通过“PyParsing入门”一书进行了阅读,其中包含了一个很好的章节,涵盖了类似的语法。数据解析的

两个例子是:

sum(5,10,avg(15,20))+10 
stdev(5,10)*2 

现在,我已经拿出了排序的那个解析公式,但忽略 扩展功能和运算符优先级的语法。

什么是继续使用它的最佳做法:我应该添加parseActions 单词与函数名称(sum,avg ...)匹配。如果我构建一个嵌套的 列表,我可以深入地分析结果并评估函数吗?

回答

3

如果没有看到更多的代码,建议有点难。不过,从您所描述的内容来看,这听起来像是大多数标记,识别标点符号的各种位,并从代数运算符的数字常量中区分变量名。 nestedExpr将赋予一些结构,但只有基本的括号嵌套 - 这仍然会为您的解析后工作留下运算符优先级处理。

如果您正在学习解析中缀表示法,可以通过一系列pyparsing示例来查看和研究(在pyparsing wiki Examples page)。从fourFn.py开始,这实际上是一个函数中缀表示法解析器。查看其BNF()方法,并理解递归定义是如何工作的(不必担心pushFirst解析操作)。通过以这种方式构造解析器,运算符优先级被直接构建到解析结果中。如果你解析4 + 2 * 3,一个单纯的tokenizer只会给你['4','+','2','*','3'],然后你必须弄清楚如何在添加4之前做2 * 3来获得10,而不仅仅是蛮力加4和2,然后乘以3(这给出了18)的错误答案。在fourFn.py中的解析器会给你['4','+',['2','*','3']],这是足够的结构,你可以知道在将它添加到4之前评估2 * 3部分。

这个解析中缀符号和操作优先级的整个概念非常常见,我写了一个帮助功能,完成了大部分艰苦工作,称为operatorPrecedence。您可以在示例simpleArith.py中看到这是如何工作的,然后转到eval_arith.py以查看需要创建解析结构的评估程序的扩展。 simpleBool.py是另一个很好的例子,显示逻辑术语AND'ed和OR'ed的优先顺序。

最后,由于您正在做类似Excel的事情,请看看excelExpr.py。它试图处理在评估Excel单元格引用时得到的一些疯狂的角落案例,包括对其他工作表和其他工作簿的引用。

祝你好运!

+0

'operatorPrecedence'在pyparsing的当前版本中被重命名为'infixNotation' - 两个名称都可以兼容,但将来'operatorPrecedence'的某个点会被删除。 – PaulMcG 2013-03-14 19:02:35