<p>像您所说的那样,让解析操作成为instancemethods,但不重新实例化类怎么样?相反,当您想解析另一个翻译单元时,请在同一个解析器对象中重置上下文。在</p>
<p>像这样:</p>
<pre><code>from pyparsing import Keyword, Word, OneOrMore, alphas, nums
class Parser:
def __init__(self):
ident = Word(alphas)
identval = Word(alphas).setParseAction(self.identval_act)
numlit = Word(nums).setParseAction(self.numlit_act)
expr = identval | numlit
letstmt = (Keyword("let") + ident + expr).setParseAction(self.letstmt_act)
printstmt = (Keyword("print") + expr).setParseAction(self.printstmt_act)
program = OneOrMore(letstmt | printstmt)
self.symtab = {}
self.grammar = program
def identval_act(self, (ident,)):
return self.symtab[ident]
def numlit_act(self, (numlit,)):
return int(numlit)
def letstmt_act(self, (_, ident, val)):
self.symtab[ident] = val
def printstmt_act(self, (_, expr)):
print expr
def reset(self):
self.symtab = {}
def parse(self, s):
self.grammar.parseString(s)
P = Parser()
P.parse("""let foo 10
print foo
let bar foo
print bar
""")
print P.symtab
P.parse("print foo") # context is kept.
P.reset()
P.parse("print foo") # but here it is reset and this fails
</code></pre>
<p>在本例中,“symtab”是您的上下文。在</p>
<p>如果您尝试在不同的线程中进行并行解析,这将严重失败,但我不明白如何在共享解析操作中正常工作。在</p>