Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无限递归预测解析器_Python_Parsing_Grammar - Fatal编程技术网

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()返回
为了解决这个问题,我添加了最后一个if语句。 总之,正确的预测解析器是:

#!/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。”)