LIBLR
LIBLR copied to clipboard
建议给Node类添加print函数
调试时,直接输出Node很难读,例如:
import LIBLR
grammar = r'''
%token NUMBER
%left '+' '-'
%left '*' '/' '%'
%left '^'
expr:expr '^' expr {pow}
|expr '+' expr {add}
| expr '-' expr {sub}
| expr '*' expr {mul}
| expr '/' expr {div}
| '(' expr ')' {get2}
| '-' expr {negative}
| '+' expr {positive}
| NUMBER {getint}
;
@ignore [ \r\n\t]*
@match NUMBER \d+
'''
parser = LIBLR.create_parser(grammar)
a=parser('1^6*(1+3)/2')
print(a)
输出
Node(Symbol('expr'), [Node(Symbol('expr'), [Node(Symbol('expr'), [Node(Symbol('expr'), ['1']), '^', Node(Symbol('expr'), ['6'])]), '*', Node(Symbol('expr'), ['(', Node(Symbol('expr'), [Node(Symbol('expr'), ['1']), '+', Node(Symbol('expr'), ['3'])]), ')'])]), '/', Node(Symbol('expr'), ['2'])])
建议给Node类添加print函数:
#----------------------------------------------------------------------
# Node
#----------------------------------------------------------------------
def _printNode(x,prestr):
print(prestr,end='')
if type(x)==type(' '):
print(x)
return
print(x.name)
for i in x.child:
_printNode(i,prestr+'| ')
class Node (object):
def __init__ (self, name, child):
self.name = name
self.child = [n for n in child]
def __repr__ (self):
clsname = type(self).__name__
return '%s(%r, %r)'%(clsname, self.name, self.child)
def __str__ (self):
return self.__repr__()
def print(self):
_printNode(self,'')
这样,输出信息就很清晰了
import LIBLR
grammar = r'''
%token NUMBER
%left '+' '-'
%left '*' '/' '%'
%left '^'
expr:expr '^' expr {pow}
|expr '+' expr {add}
| expr '-' expr {sub}
| expr '*' expr {mul}
| expr '/' expr {div}
| '(' expr ')' {get2}
| '-' expr {negative}
| '+' expr {positive}
| NUMBER {getint}
;
@ignore [ \r\n\t]*
@match NUMBER \d+
'''
parser = LIBLR.create_parser(grammar)
a=parser('1^6*(1+3)/2')
a.print()
expr
| expr
| | expr
| | | expr
| | | | 1
| | | ^
| | | expr
| | | | 6
| | *
| | expr
| | | (
| | | expr
| | | | expr
| | | | | 1
| | | | +
| | | | expr
| | | | | 3
| | | )
| /
| expr
| | 2