タイトルがPlyを使って式計算機を作ろうとしているので、私はまだ完全なコードを部分的に終えていませんでした。 トレースバック(最新の最後の呼び出し): ファイル "EX3.py"、行69、 のパーサー= yacc.yacc() ファイル "/Users/mostafa.osama2/anaconda3/lib/python3。 6 /のsite-packages /プライ/ yacc.py」、行3317は、YACC レイズYaccError( 'パーサを構築することができません')に ply.yacc.YaccError:ここパーサlexer、parser、式計算をしようとしています
を構築することができませんが、私のコードは次のとおりです。
import ply.lex as lex
import ply.yacc as yacc
import sys
tokens = ['INT','FLOAT' , 'NAME' , 'PLUS' , 'MINUS' , 'DIVIDE' , 'MULTIPLY' ,
'EQUALS']
#list of tokens , for grammar checking
t_PLUS = r'\+'
t_MINUS = r'\-'
t_MULTIPLY = r'\*'
t_DIVIDE = r'\/'
t_EQUALS = r'\='
t_ignore = r' ' # used for ignoring spaces between numbers and operators
#has to match name of token,
def t_FLOAT(t):
r'\d+.\d+' # 1.2 is a float , 1.any number is a float
t.value = float(t.value)
return t
def t_INT(t):
r'\d+'
t.value = int(t.value)
return t # t is our token object
def t_NAME(t):
r'[a-zA-Z_][a-zA-Z_0-9]*' #star means 0 or more, first char is a-zA-z , second character is a-zA-z0-9
t.type = 'NAME'
return t
def t_error(t):
print("Illegal characters!")
t.lexer.skip(1) # skips 1 token onwards
lexer = lex.lex()
def p_calc(p): # p is a tuple
'''
calc : expression
| empty
'''
print(p[1])
def p_expression(p):
'''
expression : expression PLUS expression
| expression DIVIDE expression
| expression PLUS expression
| expression MINUS expression
'''
p[0] = (p[2] , p[1] , p[3])
def p_expression(p):
'''
expression : INT
| FLOAT
'''
p[0] = p[1]
def p_empty(p):
'''
empty:
'''
p[0] = None
parser = yacc.yacc()
while True:
try:
s = input('')
except EOFError: # when u press contorl D on keyboard
break
parser.parse(s)
すべてのエラーメッセージを引用する必要があります。これははるかに有益です。 (また、あなたは*エラーメッセージのシーケンス全体を読む必要があります。これはあなた自身で問題を解決するのに役立つかもしれません) – rici
私は理解していません、1つのエラーメッセージとその質問にあります –
私はpython3をそのファイルで実行しました。トレースバックを生成する前に、2つのPLYエラーメッセージが表示されました。より慎重に見てください。 ( 'ERROR:c.py:65:ルール 'empty:'と'警告:c.py:57:関数p_expressionが再定義されました。 – rici