我正在尝试使用python pyparsing进行解析.在制作递归解析器时我陷入了困境.
让我解释一下这个问题
我想制作元素的笛卡尔积.语法是
cross({elements },{element})
我提出了更具体的方式
cross({a},{c1}) or cross({a,b},{c1}) or cross({a,b,c,d},{c1}) or
所以一般形式是第一组将有n个元素(a,b,c,d).第二组将有一个元素,因此最终输出将是笛卡尔积.
语法是递归的,因为它可以像n级一样
cross(cross({a,b},{c1}),{c2})
这意味着用c1交叉a,b.让我们说结果我们.我们再次与c2交叉
这可以直到n级交叉(交叉(交叉(交叉......)
我想要的是使用setparseAction初始化对象
所以我将有2节课
class object1(object): This will be used by a,b,c,d class object2(object): This will hold cross elements
我需要帮助,我无法做出递归解析器.
您应该查看其他语言的定义,以了解通常如何处理这些语言.
例如,看看如何定义乘法.
事实并非如此
{expression} * {expression}
因为递归很难处理,并且没有暗示的从左到右的排序.你经常看到的是像
{term} + {factor} {factor} * {unary-expression}
这为运营商提供了优先级和从左到右的排序.
看一下像http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf这样的例子来说明这样的事情是如何构建的.