【发布时间】:2014-06-19 21:01:23
【问题描述】:
好吧,我处理这个语法有问题:
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()
我知道,前瞻没有改变,但我该如何解决这个问题?我是语法和解析器的初学者。
【问题讨论】:
-
简而言之,尽管输入用完后会出现
IndexErrors,但您仍会不断增加pos。除修复此代码所需的其他事项外,我建议从删除所有全局变量开始。 (除了读取输入之外,完全没有可变状态的额外功劳。) -
现在它可以正常工作了。没有全局变量,我无法思考。
-
@dxhj 思考参数和
return值 -
@jonrsharpe 或某种
StreamParser对象... -
你能举个例子吗? (“简而言之,尽管输入用完后会出现 IndexErrors,但你会不断增加 pos。”)