我用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/上的文件。 那么如何得到预期的递归组合呢?提前谢谢
目前没有回答
相关问题 更多 >
编程相关推荐