pyPEG2 递归合成导致意外的结果

2024-09-28 23:43:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pyPEG2创建了语法,用于解析类似于C的表达式,例如:

(var++)++
((var++)++)++
and even more

代码如下:

import re
from pypeg2 import *

class Parentheses( List ):
    pass

class Operator( List ):
    grammar = [ word, Parentheses ]

class OpOne( str ):
    grammar = re.compile( r'[-\+\*&]' )

class OpOnePP( str ):
    grammar = re.compile( r'\+{2}|-{2}' )

class OpOnePostExpr( List ):
    grammar = Operator, [OpOnePP, OpOne]

class OpOnePreExpr( List ):
    grammar = [OpOnePP, OpOne], Operator

class OpOneExpr( List ):
    grammar = [ OpOnePostExpr, OpOnePreExpr ]

Parentheses.grammar = '(',  [OpOneExpr, Operator], ')'

看起来这个例子已经被正常解析了

tree = parse( '''(var++)++''' , OpOneExpr)
tree

OpOneExpr([OpOnePostExpr([Operator([Parentheses([OpOneExpr([OpOnePostExpr([Operator(['var']), '++'])])])]), '++'])])

这里,合成结果不是预期的(var++)++

print( compose(tree) )

Parentheses([OpOneExpr([OpOnePostExpr([Operator(['var']), '++'])])]) ++

但是,没有递归的测试用例可以像预期的那样工作

compose(  parse( """(var++)""", Parentheses ) )

'(var ++)'

我毫无头绪地读了https://fdik.org/pyPEG/上的文件。 那么如何得到预期的递归组合呢?提前谢谢


Tags: importretreevaroperatorlistclasscompile