fx92-interpreter/printer.py

75 lines
1.6 KiB
Python

# fx-92 Scientifique Collège+ language interpreter: AST printer
from 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
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"]