LIBLR icon indicating copy to clipboard operation
LIBLR copied to clipboard

建议给Node类添加print函数

Open konyakest opened this issue 1 year ago • 0 comments

调试时,直接输出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

konyakest avatar Feb 04 '23 12:02 konyakest