diff --git a/Project-02-03/lib/console.py b/Project-02-03/lib/console.py new file mode 100644 index 0000000..71e59c3 --- /dev/null +++ b/Project-02-03/lib/console.py @@ -0,0 +1,26 @@ +def prompt_choice(prompt: str, options: list) -> int: + print(prompt) + for i, opt in enumerate(options, 1): + print(f" {i}. {opt}") + + while True: + try: + s = input(f"Enter choice (1-{len(options)}): ").strip() + idx = int(s) - 1 + if 0 <= idx < len(options): + return idx + except Exception: + pass + print(f"Invalid. Enter a number between 1-{len(options)}.") + +def prompt_confirmation(question: str, default="y"): + s = input(f"{question} (y/n) [{default}]: ").strip().lower() + if not s: + s = default + return s.startswith("y") + +def search_programs(): + base = Path(__file__).parent / "triplaprograms" + if not base.exists(): + return [] + return sorted([f for f in base.glob("*.tripla")]) \ No newline at end of file diff --git a/Project-02/main.py b/Project-02-03/main.py similarity index 57% rename from Project-02/main.py rename to Project-02-03/main.py index 53ae503..e0e6a9f 100644 --- a/Project-02/main.py +++ b/Project-02-03/main.py @@ -4,14 +4,17 @@ import syntax from pathlib import Path from graphviz import Source + import matplotlib.pyplot as plt import matplotlib.image as mpimg +import lib.console as cnsl import os import matplotlib matplotlib.use("TkAgg") -def render_ast_from_string(dot_string: str): +# Renders a diagram of the AST +def render_diagram(dot_string: str): # Set DPI for PNG os.environ["GV_FILE_DPI"] = "300" @@ -27,6 +30,7 @@ def render_ast_from_string(dot_string: str): plt.axis("off") plt.show() +# Pretty prints the AST def pretty_print(node, indent=0): prefix = " " * indent print(f"{prefix}{type(node).__name__}:") @@ -47,6 +51,7 @@ def pretty_print(node, indent=0): else: print(f"{prefix} {key}: {value}") +# Exports the AST as a DOT file def export_dot_file(dot_string: str, filename: str): try: Path(filename).write_text(dot_string, encoding="utf-8") @@ -54,69 +59,42 @@ def export_dot_file(dot_string: str, filename: str): except Exception as e: print(f"Could not save DOT file: {e}") -def __prompt_choice(prompt: str, options: list) -> int: - print(prompt) - for i, opt in enumerate(options, 1): - print(f" {i}. {opt}") - - while True: - try: - s = input(f"Enter choice (1-{len(options)}): ").strip() - idx = int(s) - 1 - if 0 <= idx < len(options): - return idx - except Exception: - pass - print(f"Invalid. Enter a number between 1-{len(options)}.") - -def __prompt_yesno(question: str, default="y"): - s = input(f"{question} (y/n) [{default}]: ").strip().lower() - if not s: - s = default - return s.startswith("y") - -def __search_programs(): - base = Path(__file__).parent / "triplaprograms" - if not base.exists(): - return [] - return sorted([f for f in base.glob("*.tripla")]) - if __name__ == "__main__": print("\nTRIPLA Parser Tool") while True: - choice = __prompt_choice("\nSelect action:", ["Parse .tripla", "Exit"]) + choice = cnsl.prompt_choice("\nSelect action:", ["Parse .tripla", "Exit"]) if choice == 1: print("\nBye Bye.") break - programs = __search_programs() + programs = cnsl.search_programs() if not programs: print("\nNo .tripla files found.") continue - idx = __prompt_choice("\nSelect program to parse:", [p.name for p in programs]) + idx = cnsl.prompt_choice("\nSelect program to parse:", [p.name for p in programs]) path = programs[idx] source = path.read_text() ast = yacc.parser.parse(source) # Pretty print - if __prompt_yesno("\nPretty-print AST?"): + if cnsl.prompt_confirmation("\nPretty-print AST?"): print("") pretty_print(ast) # Export DOT dot_str = ast.to_dot() - if __prompt_yesno("Export AST as .dot file?"): + if cnsl.prompt_confirmation("Export AST as .dot file?"): default = f"{path.stem}.dot" - out = input(f"Filename [{default}]: ").strip() - if not out: - out = default - export_dot_file(dot_str, out) + cnsl = input(f"Filename [{default}]: ").strip() + if not cnsl: + cnsl = default + export_dot_file(dot_str, cnsl) # Display AST diagram - if __prompt_yesno("Display AST diagram?"): - render_ast_from_string(dot_str) + if cnsl.prompt_confirmation("Display AST diagram?"): + render_diagram(dot_str) print("Rendered AST diagram.") diff --git a/Project-02/parser.out b/Project-02-03/parser.out similarity index 100% rename from Project-02/parser.out rename to Project-02-03/parser.out diff --git a/Project-02/parsetab.py b/Project-02-03/parsetab.py similarity index 100% rename from Project-02/parsetab.py rename to Project-02-03/parsetab.py diff --git a/Project-02/syntax.py b/Project-02-03/syntax.py similarity index 94% rename from Project-02/syntax.py rename to Project-02-03/syntax.py index 9ca58e6..06bb947 100644 --- a/Project-02/syntax.py +++ b/Project-02-03/syntax.py @@ -9,8 +9,8 @@ class EXPRESSION: def copy(): return EXPRESSION() + # Returns a list of tuples (edge_name, child_expression) def children(self): - """Return a list of (name, childNode).""" out = [] for key, value in self.__dict__.items(): if key == "pp": @@ -23,6 +23,7 @@ class EXPRESSION: out.append((f"{key}{i}", elem)) return out + # Export AST to dot format def to_dot(self, visited=None, root=True): if visited is None: visited = set() diff --git a/Project-02/triplalex.py b/Project-02-03/triplalex.py similarity index 100% rename from Project-02/triplalex.py rename to Project-02-03/triplalex.py diff --git a/Project-02/triplaprograms/argsParamsExample.tripla b/Project-02-03/triplaprograms/argsParamsExample.tripla similarity index 100% rename from Project-02/triplaprograms/argsParamsExample.tripla rename to Project-02-03/triplaprograms/argsParamsExample.tripla diff --git a/Project-02/triplaprograms/complex.tripla b/Project-02-03/triplaprograms/complex.tripla similarity index 100% rename from Project-02/triplaprograms/complex.tripla rename to Project-02-03/triplaprograms/complex.tripla diff --git a/Project-02/triplaprograms/condition.tripla b/Project-02-03/triplaprograms/condition.tripla similarity index 100% rename from Project-02/triplaprograms/condition.tripla rename to Project-02-03/triplaprograms/condition.tripla diff --git a/Project-02/triplaprograms/defSemiExample.tripla b/Project-02-03/triplaprograms/defSemiExample.tripla similarity index 100% rename from Project-02/triplaprograms/defSemiExample.tripla rename to Project-02-03/triplaprograms/defSemiExample.tripla diff --git a/Project-02/triplaprograms/factorial.tripla b/Project-02-03/triplaprograms/factorial.tripla similarity index 100% rename from Project-02/triplaprograms/factorial.tripla rename to Project-02-03/triplaprograms/factorial.tripla diff --git a/Project-02/triplaprograms/faulty-multiple-let.tripla b/Project-02-03/triplaprograms/faulty-multiple-let.tripla similarity index 100% rename from Project-02/triplaprograms/faulty-multiple-let.tripla rename to Project-02-03/triplaprograms/faulty-multiple-let.tripla diff --git a/Project-02/triplaprograms/faulty_if.tripla b/Project-02-03/triplaprograms/faulty_if.tripla similarity index 100% rename from Project-02/triplaprograms/faulty_if.tripla rename to Project-02-03/triplaprograms/faulty_if.tripla diff --git a/Project-02/triplaprograms/func.tripla b/Project-02-03/triplaprograms/func.tripla similarity index 100% rename from Project-02/triplaprograms/func.tripla rename to Project-02-03/triplaprograms/func.tripla diff --git a/Project-02/triplaprograms/ggT_euclid_iter.tripla b/Project-02-03/triplaprograms/ggT_euclid_iter.tripla similarity index 100% rename from Project-02/triplaprograms/ggT_euclid_iter.tripla rename to Project-02-03/triplaprograms/ggT_euclid_iter.tripla diff --git a/Project-02/triplaprograms/ggT_euclid_rec.tripla b/Project-02-03/triplaprograms/ggT_euclid_rec.tripla similarity index 100% rename from Project-02/triplaprograms/ggT_euclid_rec.tripla rename to Project-02-03/triplaprograms/ggT_euclid_rec.tripla diff --git a/Project-02/triplaprograms/invalidProgram.tripla b/Project-02-03/triplaprograms/invalidProgram.tripla similarity index 100% rename from Project-02/triplaprograms/invalidProgram.tripla rename to Project-02-03/triplaprograms/invalidProgram.tripla diff --git a/Project-02/triplaprograms/multiple-let-with-same-func-name.tripla b/Project-02-03/triplaprograms/multiple-let-with-same-func-name.tripla similarity index 100% rename from Project-02/triplaprograms/multiple-let-with-same-func-name.tripla rename to Project-02-03/triplaprograms/multiple-let-with-same-func-name.tripla diff --git a/Project-02/triplaprograms/multiple-let.tripla b/Project-02-03/triplaprograms/multiple-let.tripla similarity index 100% rename from Project-02/triplaprograms/multiple-let.tripla rename to Project-02-03/triplaprograms/multiple-let.tripla diff --git a/Project-02/triplaprograms/or.tripla b/Project-02-03/triplaprograms/or.tripla similarity index 100% rename from Project-02/triplaprograms/or.tripla rename to Project-02-03/triplaprograms/or.tripla diff --git a/Project-02/triplaprograms/p1.tripla b/Project-02-03/triplaprograms/p1.tripla similarity index 100% rename from Project-02/triplaprograms/p1.tripla rename to Project-02-03/triplaprograms/p1.tripla diff --git a/Project-02/triplaprograms/p2.tripla b/Project-02-03/triplaprograms/p2.tripla similarity index 100% rename from Project-02/triplaprograms/p2.tripla rename to Project-02-03/triplaprograms/p2.tripla diff --git a/Project-02/triplaprograms/p3.tripla b/Project-02-03/triplaprograms/p3.tripla similarity index 100% rename from Project-02/triplaprograms/p3.tripla rename to Project-02-03/triplaprograms/p3.tripla diff --git a/Project-02/triplaprograms/p4.tripla b/Project-02-03/triplaprograms/p4.tripla similarity index 100% rename from Project-02/triplaprograms/p4.tripla rename to Project-02-03/triplaprograms/p4.tripla diff --git a/Project-02/triplaprograms/p5.tripla b/Project-02-03/triplaprograms/p5.tripla similarity index 100% rename from Project-02/triplaprograms/p5.tripla rename to Project-02-03/triplaprograms/p5.tripla diff --git a/Project-02/triplaprograms/p6.tripla b/Project-02-03/triplaprograms/p6.tripla similarity index 100% rename from Project-02/triplaprograms/p6.tripla rename to Project-02-03/triplaprograms/p6.tripla diff --git a/Project-02/triplaprograms/side_effect.tripla b/Project-02-03/triplaprograms/side_effect.tripla similarity index 100% rename from Project-02/triplaprograms/side_effect.tripla rename to Project-02-03/triplaprograms/side_effect.tripla diff --git a/Project-02/triplaprograms/simple_dfa.tripla b/Project-02-03/triplaprograms/simple_dfa.tripla similarity index 100% rename from Project-02/triplaprograms/simple_dfa.tripla rename to Project-02-03/triplaprograms/simple_dfa.tripla diff --git a/Project-02/triplaprograms/simple_if.tripla b/Project-02-03/triplaprograms/simple_if.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if.tripla rename to Project-02-03/triplaprograms/simple_if.tripla diff --git a/Project-02/triplaprograms/simple_if_2.tripla b/Project-02-03/triplaprograms/simple_if_2.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_2.tripla rename to Project-02-03/triplaprograms/simple_if_2.tripla diff --git a/Project-02/triplaprograms/simple_if_3.tripla b/Project-02-03/triplaprograms/simple_if_3.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_3.tripla rename to Project-02-03/triplaprograms/simple_if_3.tripla diff --git a/Project-02/triplaprograms/simple_if_4.tripla b/Project-02-03/triplaprograms/simple_if_4.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_4.tripla rename to Project-02-03/triplaprograms/simple_if_4.tripla diff --git a/Project-02/triplaprograms/simple_if_5.tripla b/Project-02-03/triplaprograms/simple_if_5.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_5.tripla rename to Project-02-03/triplaprograms/simple_if_5.tripla diff --git a/Project-02/triplaprograms/simple_if_6.tripla b/Project-02-03/triplaprograms/simple_if_6.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_6.tripla rename to Project-02-03/triplaprograms/simple_if_6.tripla diff --git a/Project-02/triplaprograms/simple_if_7.tripla b/Project-02-03/triplaprograms/simple_if_7.tripla similarity index 100% rename from Project-02/triplaprograms/simple_if_7.tripla rename to Project-02-03/triplaprograms/simple_if_7.tripla diff --git a/Project-02/triplaprograms/square.tripla b/Project-02-03/triplaprograms/square.tripla similarity index 100% rename from Project-02/triplaprograms/square.tripla rename to Project-02-03/triplaprograms/square.tripla diff --git a/Project-02/triplaprograms/validProgram.tripla b/Project-02-03/triplaprograms/validProgram.tripla similarity index 100% rename from Project-02/triplaprograms/validProgram.tripla rename to Project-02-03/triplaprograms/validProgram.tripla diff --git a/Project-02/triplaprograms/while.tripla b/Project-02-03/triplaprograms/while.tripla similarity index 100% rename from Project-02/triplaprograms/while.tripla rename to Project-02-03/triplaprograms/while.tripla diff --git a/Project-02/triplaprograms/while_2.tripla b/Project-02-03/triplaprograms/while_2.tripla similarity index 100% rename from Project-02/triplaprograms/while_2.tripla rename to Project-02-03/triplaprograms/while_2.tripla diff --git a/Project-02/triplaprograms/wrapped-ggT.tripla b/Project-02-03/triplaprograms/wrapped-ggT.tripla similarity index 100% rename from Project-02/triplaprograms/wrapped-ggT.tripla rename to Project-02-03/triplaprograms/wrapped-ggT.tripla diff --git a/Project-02/triplaprograms/wrapper.tripla b/Project-02-03/triplaprograms/wrapper.tripla similarity index 100% rename from Project-02/triplaprograms/wrapper.tripla rename to Project-02-03/triplaprograms/wrapper.tripla diff --git a/Project-02/triplayacc.py b/Project-02-03/triplayacc.py similarity index 100% rename from Project-02/triplayacc.py rename to Project-02-03/triplayacc.py diff --git a/Project-02/Source.gv.png b/Project-02/Source.gv.png deleted file mode 100644 index 583d0b4..0000000 Binary files a/Project-02/Source.gv.png and /dev/null differ diff --git a/Project-02/test.py b/Project-02/test.py deleted file mode 100644 index d9727ae..0000000 --- a/Project-02/test.py +++ /dev/null @@ -1,18 +0,0 @@ -# This is a sample Python script for testing your TRIPLA parser. - -# In PyCharm press Umschalt+F10 to execute it. - -import triplayacc as yacc -import triplalex as lex - -def test_parser(name): - source = "\n".join(open(name).readlines()) - ast = yacc.parser.parse(source) # ,debug=True) - print("AST:") - print(ast) - -# Press the green button in the gutter to run the script. -if __name__ == '__main__': - test_parser('triplaprograms/complex.tripla') - -# See PyCharm help at https://www.jetbrains.com/help/pycharm/ \ No newline at end of file