import ply.lex as lex reserved = {'while' : 'WHILE', 'if' : 'IF', 'else' : 'ELSE', 'pass' : 'PASS'} tokens = ['VAR','NUM','END','OP', 'ISTGLEICH','DOPPELPUNKT','PLUS','MINUS'] + list(reserved.values()) # literals = "=:+-" def t_ISTGLEICH(t): r'=' print(t) return t def t_DOPPELPUNKT(t): r':' print(t) return t def t_PLUS(t): r'\+' print(t) return t def t_MINUS(t): r'\-' print(t) return t def t_IGN(t): r'print\(.*' # kein return, damit die Zeile vom Parser nicht gesehen wird print(t) def t_VAR(t): r'[a-zA-Z_][a-zA-Z_0-9]*' t.type = reserved.get(t.value,'VAR') print(t) return t def t_NUM(t): r'\d+' t.value = int(t.value) print(t) return t def t_END(t): r'\#end' print(t) return t def t_OP(t): r'<=?|>=?|==|!=' print(t) return t def t_newline(t): r'\n+' t.lexer.lineno = t.lexer.lineno + len(t.value) t_ignore = ' \t' def t_error(t): print('Unerwartetes Zeichen:',t.value[0],',Zeile:',s.lineno) t.lexer.skip(1) s = lex.lex() import ply.yacc as yacc def p_0(p): "start : kette" print("start : kette") def p_1(p): 'kette : befehl kette' print('kette : befehl kette') def p_2(p): 'kette :' print('kette :') def p_3(p): 'befehl : whileAnw' print('befehl : whileAnw') def p_4(p): 'befehl : ifAnw' print('befehl : ifAnw') def p_5(p): 'befehl : zuw' print('befehl : zuw') def p_6(p): 'befehl : PASS' print('befehl : PASS') def p_9(p): "whileAnw : WHILE cond DOPPELPUNKT kette END" print("whileAnw : WHILE cond DOPPELPUNKT kette END") def p_10(p): "ifAnw : IF cond DOPPELPUNKT kette ELSE DOPPELPUNKT kette END" print("ifAnw : IF cond DOPPELPUNKT kette ELSE DOPPELPUNKT kette END") def p_11(p): "cond : VAR OP VAR" print("cond : VAR OP VAR") def p_12(p): 'cond : VAR OP NUM' print('cond : VAR OP NUM') def p_13(p): 'cond : NUM OP VAR' print('cond : NUM OP VAR') def p_14(p): "zuw : VAR ISTGLEICH ausdruck" print("zuw : VAR ISTGLEICH ausdruck") def p_15(p): 'ausdruck : NUM' print('ausdruck : NUM') def p_16(p): 'ausdruck : VAR' print('ausdruck : VAR') def p_17(p): "ausdruck : VAR PLUS NUM" print("ausdruck : VAR PLUS NUM") def p_18(p): "ausdruck : VAR MINUS NUM" print("ausdruck : VAR MINUS NUM") def p_19(p): "ausdruck : NUM PLUS VAR" print("ausdruck : NUM PLUS VAR") def p_20(p): "ausdruck : VAR PLUS VAR" print("ausdruck : VAR PLUS VAR") def p_21(p): "ausdruck : VAR MINUS VAR" print("ausdruck : VAR MINUS VAR") def p_error(p): print('Syntaxfehler in Zeile:',s.lineno) p = yacc.yacc()