【发布时间】:2022-11-12 08:18:37
【问题描述】:
我在 python 中运行 PLY 时遇到问题。我已经通过在线下载安装文件并从命令提示符运行它来安装 PLY。安装成功。但是,我不断收到“没有名为 ply 的模块”的错误。我把代码放在下面:
VS_Code 不断在 import 语句的 ply 和 ply.yacc 部分下放置波浪线。
from ply import lex
import ply.yacc as yacc
tokens = (
'MINUS',
'TIMES',
'DIV',
'LPAREN',
'RPAREN',
'NUMBER',
)
t_ignore = ' \t'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIV = r'/'
t_LPAREN = r'\('
t_RPAREN = r'\)'
def t_NUMBER( t ) :
r'[0-9]+'
t.value = int( t.value )
return t
def t_newline( t ):
r'\n+'
t.lexer.lineno += len( t.value )
def t_error( t ):
print("Invalid Token:",t.value[0])
t.lexer.skip( 1 )
lexer = lex.lex()
precedence = (
( 'nonassoc', 'UMINUS' ),
( 'left', 'TIMES', 'DIV' ),
( 'left', 'MINUS' )
)
def p_sub( p ) :
'expr : expr MINUS expr'
p[0] = p[1] - p[3]
def p_expr2uminus( p ) :
'expr : MINUS expr %prec UMINUS'
p[0] = - p[2]
def p_mult_div( p ) :
'''expr : expr TIMES expr
| expr DIV expr'''
if p[2] == '*' :
p[0] = p[1] * p[3]
else :
if p[3] == 0 :
print("Can't divide by 0")
raise ZeroDivisionError('integer division by 0')
p[0] = p[1] / p[3]
def p_expr2NUM( p ) :
'expr : NUMBER'
p[0] = p[1]
def p_parens( p ) :
'expr : LPAREN expr RPAREN'
p[0] = p[2]
def p_error( p ):
print("Syntax error in input!")
parser = yacc.yacc()
res = parser.parse("5-8*6-2") # the input
##res = parser.parse("3+5*8/2") # the input
print(res)
【问题讨论】:
-
什么“安装文件”?您可以通过从the github repository 下载两个 Python 文件并将它们放在与解析器相同的目录中来“安装”Ply。
-
@rici:他们可能正在引用pypi.org/project/ply 的安装
-
@sean:可能是,但是“我下载了安装文件并运行它”的描述似乎与使用 pypi 不一致,这通常涉及使用
pip,不是吗?这就是我要求澄清的原因。