import ply.lex as lex reserved = {'label' : 'LABEL', 'if' : 'IF', 'goto' : 'GOTO', 'else' : 'ELSE' } tokens = ['ID','LID','NUMBER','FROMZEILE', 'PRINTZEILE','KOMMENTAR'] + list(reserved.values()) literals = '=:>-+' t_LID = r'\.[a-zA-Z_][a-zA-Z_0-9]*' def t_FROMZEILE(t): r'from.*' def t_PRINTZEILE(t): r'print.*' def t_KOMMENTAR(t): r'\#.*' def t_ID(t): r'[a-zA-Z_][a-zA-Z_0-9]*' t.type = reserved.get(t.value,'ID') # get gibt Wert aus Dictionary zurück, return t # wenn nicht gefunden 'ID' def t_NUMBER(t): r'\d+' t.value = int(t.value) 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 n = 1 # Zeilennummer der Ausgabe nv = 1 # Variablennummer sym = {} # Symboltabelle, Dictionary var = [] # Liste der Anfangs-Variablen mit Werten lab = [] # Liste der Labels lauf1 = '' # String für 1.Lauf def p_0(p): 'bon : befehl bon' def p_1(p): 'bon :' def p_2(p): 'befehl : inc' def p_3(p): 'befehl : dec' def p_4(p): 'befehl : jmp' def p_5(p): 'befehl : tst' def p_6(p): 'befehl : zuw' def p_7(p): 'befehl : lab' def p_8(p): "inc : ID '=' ID '+' NUMBER" if (p[1] != p[3]) or (p[5] != 1): print('Syntaxfehler in inc, Zeile:',s.lineno) raise SyntaxError global lauf1,n lauf1 = lauf1+'inc '+p[1]+'\n' n = n+1 def p_9(p): "dec : ID '=' ID '-' NUMBER" if (p[1] != p[3]) or (p[5] != 1): print('Syntaxfehler in dec, Zeile:',s.lineno) raise SyntaxError global lauf1,n lauf1 = lauf1+'dec '+p[1]+'\n' n = n+1 def p_10(p): "jmp : GOTO LID" global lauf1,n lauf1 = lauf1+'jmp '+p[2]+'\n' n = n+1 def p_11(p): "tst : IF ID '>' NUMBER ':' GOTO LID ELSE ':' GOTO LID" if (p[4] != 0): print('Syntaxfehler in tst, Zeile:',s.lineno) raise SyntaxError global lauf1,n lauf1 = lauf1+'tst '+p[2]+'\n' lauf1 = lauf1+'jmp '+p[7]+'\n' lauf1 = lauf1+'jmp '+p[11]+'\n' n = n+3 def p_12(p): "zuw : ID '=' NUMBER" global var,sym,nv sym.update({p[1]:nv}) var.append((p[1],p[3])) nv = nv + 1 def p_13(p): 'lab : LABEL LID' global lab,sym lab.append((p[2],n)) sym.update({p[2]:n}) def p_error(p): print('Syntaxfehler in Zeile:',s.lineno) pr = yacc.yacc() import sys try: dateiname = sys.argv[1] except: dateiname = 'sumn.py' datei = open(dateiname,'r') inhalt = datei.read() datei.close() pr.parse(inhalt) # Symboltabelle einarbeiten und Ausgabedatei erzeugen zeilen = lauf1.split('\n') zeilen.remove('') ausgabename = dateiname.split('.')[0]+'.bon' datei = open(ausgabename,'w') for z in zeilen: zalt = z.split(' ') zneu = zalt[0]+str(sym.get(zalt[1]))+'\r\n' datei.write(zneu) datei.write('hlt\r\n') for v in var: zneu = '# '+str(v[1])+'\r\n' datei.write(zneu) for v in var: zneu = '; '+str(v[0])+' = '+str(v[1])+'\r\n' datei.write(zneu) datei.close() datei = open(ausgabename,'r') # DEBUG inhalt = datei.read() # DEBUG datei.close() # DEBUG print(inhalt) # DEBUG