# fx-92 Scientifique Collège+ language interpreter: AST printer from fx92.ast import N, Node #--- # Message definitions #--- class MessageAST: forward = "FORWARD {}" rotate = "ROTATE {}" orient = "ORIENT {}" goto = "GOTO {}, {}" pendown = "PENDOWN" penup = "PENUP" class MessageFrench: forward = "Avancer de {} pixels" rotate = "Tourner de {} degrés" orient = "S'orienter à {} degrés" goto = "Aller à x={}; y={}" pendown = "Stylo écrit" penup = "Stylo relevé" class MessageEnglish: pass #--- # Printer #--- def print_ast(n, lang="en", indent=0): if lang == "fr": lang = MessageFrench if lang == "en": lang = MessageEnglish if lang == "ast": lang = MessageAST if isinstance(n, Node) and n.type == N.PROGRAM: for arg in n.args: print_ast(arg, lang=lang, indent=indent) return print(" " * indent, end="") if not isinstance(n, Node): print("{}({})".format(type(n), n)) return if n.type in [N.CONST, N.VAR, N.REL]: print(n.args[0]) return if n.type == N.FUN: print(n.args[0] + "()") for arg in n.args[1]: print_ast(arg, lang=lang, indent=indent+2) return id = n.type.name.lower() if hasattr(lang, id): print(getattr(lang, id).format(*n.args)) else: print("{}".format(n.type.name)) if n.type in [N.FORWARD, N.ROTATE, N.ORIENT, N.GOTO] and \ n.constchildren(): return if n.type == N.ASSIGN: print_ast(n.args[0], lang=lang, indent=indent+2) print(" " * (indent+2), end="") print("->{}".format(n.args[1])) return for arg in n.args: print_ast(arg, lang=lang, indent=indent+2) # __all__ = ["print_ast"]