import tkinter as tk from tkinter import scrolledtext, messagebox from lexical.lexical import Lexical from syntax.syntax import Syntax from semantic.rule import symbol_table_pool from syntax.syntax import LL1Generator from Optimizer.optimizer import optimize, output_ir_str def process_code(input_code): lexical = Lexical() lexical.load_source(input_code) lexical_success = lexical.execute() output = [] if lexical_success: lexical_result = lexical.get_result() output.append('词法分析是否成功:\t' + str(lexical_success)) output.append('\n词法分析结果:') for i in lexical_result: output.append(f"{i.type} {i.str} {i.line}") output.append('') syntax = Syntax() syntax.put_source(lexical_result) syntax_success = syntax.execute() output.append('语法分析和语义分析是否成功\t' + str(syntax_success)) if syntax_success: output.append("\n符号表信息:\t") output.append(symbol_table_pool.debug()) output.append('\n语义分析结果:\t') output.append('四元式代码:\t') i = -1 for code in syntax.get_result().root.code: i += 1 output.append(f"{i} \t{code}") quads = [tuple(map(str.strip, str(item).strip("()").split(","))) for item in syntax.get_result().root.code] optimized_quads = optimize(quads) output.append('\n') output.append(f"优化后的四元式:\t") output.append(output_ir_str(optimized_quads)) return '\n'.join(output), '' else: return '\n'.join(output), '错误原因:\t' + syntax.get_error().info else: return '', '错误原因:\t' + lexical.get_error().info def on_submit(): input_code = input_text.get("1.0", tk.END) output_text.delete("1.0", tk.END) error_label.config(text="") try: result, error = process_code(input_code) if result: output_text.insert(tk.END, result) if error: error_label.config(text=error) except Exception as e: messagebox.showerror("程序异常", str(e)) root = tk.Tk() root.title("Hydrogen语言编译器前端演示") # 输入框 input_text = scrolledtext.ScrolledText(root, width=80, height=20) input_text.pack(padx=10, pady=5) # 提交按钮和清空按钮在同一行 button_frame = tk.Frame(root) def on_generate_ll1_table(): try: obj = LL1Generator() obj.compile() obj.show_me_what_you_got("LL1_table.csv") messagebox.showinfo("提示", "成功生成预测表") except Exception as e: messagebox.showerror("生成预测表异常", str(e)) submit_btn = tk.Button(button_frame, text="生成产生式的预测表", command=on_generate_ll1_table) submit_btn.pack(side=tk.LEFT, padx=5) button_frame.pack(pady=5) submit_btn = tk.Button(root, text="提交", command=on_submit) submit_btn.pack(pady=5) # 输出框 output_text = scrolledtext.ScrolledText(root, width=80, height=20, bg="#000000") output_text.pack(padx=10, pady=5) # 错误信息框 error_label = tk.Label(root, text="", fg="red") error_label.pack(pady=5) root.mainloop()