Python 3.x Python-Lex-Yacc报告;检测到符号“的无限递归”;

Python 3.x Python-Lex-Yacc报告;检测到符号“的无限递归”;,python-3.x,ply,Python 3.x,Ply,我在使用PLY时有很多错误。当我尝试将此添加到代码中时,会发生错误: def p_assign(p): '''assign : NAME EQUALS expr''' p[0] = ('ASSIGN',p[1],p[3]) def p_expr_plus(p): '''expr : expr PLUS term''' p[0] = ('+',p[1],p[3]) def p_term_mul(p): '''term : term TIMES factor''

我在使用PLY时有很多错误。当我尝试将此添加到代码中时,会发生错误:

def p_assign(p):
   '''assign : NAME EQUALS expr'''
    p[0] = ('ASSIGN',p[1],p[3])
def p_expr_plus(p):
    '''expr : expr PLUS term'''
    p[0] = ('+',p[1],p[3])
def p_term_mul(p):
    '''term : term TIMES factor'''
    p[0] = ('*',p[1],p[3])
def p_term_factor(p):
    '''term : factor'''
    p[0] = p[1]
def p_factor(p):
    '''factor : NUMBER'''
    p[0] = ('NUM',p[1])
但我得到了这个错误:

ERROR: C:\Users\-user-\Desktop\dw_parser.py:9: Symbol 'EQUALS' used, but not defined as a token or a rule
WARNING: Token 'COLON' defined, but not used
WARNING: Token 'DIVIDE' defined, but not used
WARNING: Token 'EQUAL' defined, but not used
WARNING: Token 'EQUAL_TO' defined, but not used
WARNING: Token 'GREATER' defined, but not used
WARNING: Token 'GREATER_EQL' defined, but not used
WARNING: Token 'LESS' defined, but not used
WARNING: Token 'LESS_EQL' defined, but not used
WARNING: Token 'LPAREN' defined, but not used
WARNING: Token 'MINUS' defined, but not used
WARNING: Token 'QUOTATION' defined, but not used
WARNING: Token 'REMAINDER' defined, but not used
WARNING: Token 'RPAREN' defined, but not used
WARNING: Token 'SEMICOLON' defined, but not used
WARNING: Token 'STRING' defined, but not used
WARNING: There are 15 unused tokens
ERROR: Infinite recursion detected for symbol 'assign'
ERROR: Infinite recursion detected for symbol 'expr'
Traceback (most recent call last):
  File "C:\Users\-user-\Desktop\dw_parser.py", line 35, in <module>
    parser = yacc.yacc()
  File "C:\Program Files\Python37\lib\site-packages\ply-3.11-py3.7.egg\ply\yacc.py", line 3432, in yacc
    raise YaccError('Unable to build parser')
ply.yacc.YaccError: Unable to build parser
错误:C:\Users \-user-\Desktop\dw\u parser.py:9:使用了符号“EQUALS”,但未定义为令牌或规则
警告:已定义标记“冒号”,但未使用
警告:标记“DIVIDE”已定义,但未使用
警告:已定义标记“EQUAL”,但未使用
警告:已定义标记“等于”,但未使用
警告:已定义标记“更大”,但未使用
警告:已定义标记“更大的EQL”,但未使用
警告:已定义标记“LESS”,但未使用
警告:已定义标记“LESS_EQL”,但未使用
警告:标记“LPAREN”已定义,但未使用
警告:标记“减号”已定义,但未使用
警告:标记“Quotence”已定义,但未使用
警告:标记“余数”已定义,但未使用
警告:已定义标记“RPAREN”,但未使用
警告:已定义标记“分号”,但未使用
警告:已定义标记“字符串”,但未使用
警告:有15个未使用的令牌
错误:检测到符号“assign”的无限递归
错误:检测到符号“expr”的无限递归
回溯(最近一次呼叫最后一次):
文件“C:\Users \-user-\Desktop\dw_parser.py”,第35行,在
parser=yacc.yacc()
文件“C:\Program Files\Python37\lib\site packages\ply-3.11-py3.7.egg\ply\yacc.py”,第3432行,在yacc中
raise YaccError('无法生成解析器')
ply.yacc.YaccError:无法生成语法分析器
下面是完整的解析器代码:
我不能将解析器代码直接放在这里,因为代码示例也不起作用。

您为
expr
定义的唯一产品是

expr : expr PLUS term
由于没有其他的产生式,
expr
无法产生有限句。将此与您为
术语制作的产品进行对比:

term : factor TIMES term
term : factor
这里有一个非递归产品,因此递归可以终止

由于PLY的工作方式,您不需要单独的解析操作函数来添加
expr:term
production;您可以使用与
术语:factor
相同的功能(以及其他类似的单元产品):


assign
也会被标记,因为它的唯一产品使用
expr
,而
expr
只会导致无限递归。希望其他错误和警告是不言自明的。

您为
expr
定义的唯一产品是

expr : expr PLUS term
由于没有其他的产生式,
expr
无法产生有限句。将此与您为
术语制作的产品进行对比:

term : factor TIMES term
term : factor
这里有一个非递归产品,因此递归可以终止

由于PLY的工作方式,您不需要单独的解析操作函数来添加
expr:term
production;您可以使用与
术语:factor
相同的功能(以及其他类似的单元产品):


assign
也会被标记,因为它的唯一产品使用
expr
,而
expr
只会导致无限递归。希望其他错误和警告都是不言自明的。

谢谢,但仍然不起作用,我放弃了。由于没有好的文档,使用PLY只是一个猜测的问题,直到某些东西起作用为止。@konniskatt:我的印象是,您要找的不是PLY特定的文档,而是如何编写和调试上下文无关语法的指南。你会在中找到一些好的信息,还有约翰·莱文关于野牛/yacc的优秀著作;我敢肯定第一版是免费的。这些资源对PLY的特殊lexer帮助不大,但PLY文档对lexing模型的描述还是很好的。谢谢,但仍然不起作用,我只是放弃了。由于没有好的文档,使用PLY只是一个猜测的问题,直到某些东西起作用为止。@konniskatt:我的印象是,您要找的不是PLY特定的文档,而是如何编写和调试上下文无关语法的指南。你会在中找到一些好的信息,还有约翰·莱文关于野牛/yacc的优秀著作;我敢肯定第一版是免费的。这些资源对PLY的特殊词法器帮助不大,但PLY文档很好地描述了词法模型。