2017-11-14 8 views
0

タイトルが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) 
+0

すべてのエラーメッセージを引用する必要があります。これははるかに有益です。 (また、あなたは*エラーメッセージのシーケンス全体を読む必要があります。これはあなた自身で問題を解決するのに役立つかもしれません) – rici

+0

私は理解していません、1つのエラーメッセージとその質問にあります –

+0

私はpython3をそのファイルで実行しました。トレースバックを生成する前に、2つのPLYエラーメッセージが表示されました。より慎重に見てください。 ( 'ERROR:c.py:65:ルール 'empty:'と'警告:c.py:57:関数p_expressionが再定義されました。 – rici

答えて

0

Plyは、解析ルールに非終端記号の名前とコロンの間に空白があると主張しています。したがってempty:は無効です。書く必要がありますempty :

また、Plyによって報告されたように、p_expressionという2つの関数を定義します。 Plyは、すべての解析関数が異なる名前を持っている必要があります(そうでなければ呼び出す方法はありません)が、p_で始まる限り、名前は何でも構いません。したがって、名前の1つを変更してください。

最後に、加算のルールは2つあり、乗算のルールはありません。 Plyは(他の問題を修正した後に)重複加算ルールについて文句を言います。また、p_error機能が不足していると訴えます。

関連する問題