[Python编程(第4版)].(Programming.Python.4th.Edition).Mark.Lutz.文字版

(yzsuai) #1

def trace(self, level):
print('.' * level + self.name)


COMPOSITES


class AssignNode(TreeNode):
def init(self, var, val):
self.var, self.val = var, val
def validate(self, dict):
self.val.validate(dict) # don't validate var
def apply(self, dict):
self.var.assign( self.val.apply(dict), dict )
def trace(self, level):
print('.' * level + 'set ')
self.var.trace(level + 3)
self.val.trace(level + 3)


#################################################################################


the parser (syntax analyser, tree builder)


#################################################################################


class Parser:
def init(self, text=''):
self.lex = Scanner(text) # make a scanner
self.vars = {'pi':3.14159} # add constants
self.traceme = TraceDefault


def parse(self, *text): # external interface
if text:
self.lex.newtext(text[0]) # reuse with new text
tree = self.analyse() # parse string
if tree:
if self.traceme: # dump parse-tree?
print(); tree.trace(0)
if self.errorCheck(tree): # check names
self.interpret(tree) # evaluate tree


def analyse(self):
try:
self.lex.scan() # get first token
return self.Goal() # build a parse-tree
except SyntaxError:
print('Syntax Error at column:', self.lex.start)
self.lex.showerror()
except LexicalError:
print('Lexical Error at column:', self.lex.start)
self.lex.showerror()


def errorCheck(self, tree):
try:
tree.validate(self.vars) # error checker
return 'ok'
except UndefinedError as instance: # args is a tuple
varinfo = instance.args
print("'%s' is undefined at column: %d" % varinfo)


Custom Language Parsers| 1451
Free download pdf