Python 无限递归预测解析器
我在处理这个语法时遇到了一个问题:Python 无限递归预测解析器,python,parsing,grammar,Python,Parsing,Grammar,我在处理这个语法时遇到了一个问题: R -> a R | e e=空生产 当我尝试推导这些输入时: “a”,“aa”,“aaa”。。我得到一个无限递归 def match(t): global pos global lookahead if lookahead == t: try: pos += 1 lookahead = inputstr[pos] except IndexError
R -> a R | e
e=空生产
当我尝试推导这些输入时:
“a”
,“aa”
,“aaa”
。。我得到一个无限递归
def match(t):
global pos
global lookahead
if lookahead == t:
try:
pos += 1
lookahead = inputstr[pos]
except IndexError:
pass
else:
raise SyntaxError("syntax error!")
def r():
if lookahead == 'a':
match('a')
r()
else:
pass # e-production
inputstr = raw_input()
lookahead = inputstr[0]
pos = 0
r()
我知道,前景不会改变,但我该如何解决这个问题?我是语法和语法分析器的初学者。索引器中的过程是错误的。一旦输入耗尽, 并且每个匹配动作都是正确的,程序应该以OK状态终止。 但是,在原始代码中,它不会终止, 但不断读取输入缓冲区之外的内容,并捕获自己的索引器。 这会导致无限递归。 预测解析器中有三处错误被捕获:
- 不正确的匹配
- 在没有epsilon规则的变量中从switch case语句中脱落
- 当输入直到结束才被读取时,从s()返回
#!/usr/bin/python
import sys
def finish(msg):
print msg
sys.exit()
def eat(t):
global pos
global lookahead
if lookahead == t:
try:
pos += 1
lookahead = inputstr[pos]
except IndexError:
#pass is wrong here ...
finish("OK")
else:
finish("ERROR")
def r():
if lookahead == 'a':
eat('a')
r()
else:
pass # e-production
inputstr = raw_input()
lookahead = inputstr[0]
pos = 0
r()
##########################
# This needs to be added #
##########################
if pos != len(inputstr):
finish("ERROR")
简言之,您不断增加
pos
,尽管输入用完后会出现indexer
s。在修复此代码所需的其他事项中,我建议从删除任何全局变量开始。(除了读取输入之外,没有任何可变状态,这是额外的奖励。)现在它可以正常工作了。如果没有全局变量,我无法进行思考。@dxhj思考参数并返回values@jonrsharpe或者某种类型的StreamParser
对象……您可以举一些例子吗?(“简言之,尽管一旦输入用完,索引器就会跟着出现,但您仍会不断增加pos。”)