285 lines
7.2 KiB
Python
285 lines
7.2 KiB
Python
from dataclasses import dataclass
|
|
|
|
from parser import Tree
|
|
from lexer import Identifier, Punctuator, IntegerConstant
|
|
import identifier_substitution
|
|
|
|
def argument_list(tree):
|
|
yield from generate(tree.children[0])
|
|
yield ", "
|
|
yield from generate(tree.children[1])
|
|
|
|
def assignment_list(tree):
|
|
yield from generate(tree.children[0])
|
|
yield ", "
|
|
yield from generate(tree.children[1])
|
|
|
|
def assignment(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " = "
|
|
yield from generate(tree.children[1])
|
|
|
|
def bit_extraction(tree):
|
|
yield "bit_extract("
|
|
yield from generate(tree.children[0])
|
|
yield ", "
|
|
yield from generate(tree.children[1])
|
|
yield ")"
|
|
|
|
def bitwise_and(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " & "
|
|
yield from generate(tree.children[1])
|
|
|
|
def bitwise_or(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " | "
|
|
yield from generate(tree.children[1])
|
|
|
|
def bitwise_xor(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " ^ "
|
|
yield from generate(tree.children[1])
|
|
|
|
def block_item_list(tree):
|
|
yield from generate(tree.children[0])
|
|
yield from generate(tree.children[1])
|
|
|
|
def compound_statement(tree):
|
|
yield "\n{\n"
|
|
if tree.children:
|
|
yield from generate(tree.children[0])
|
|
yield "}\n"
|
|
|
|
def expression_statement(tree):
|
|
yield from generate(tree.children[0])
|
|
yield ";\n"
|
|
|
|
def for_expression(tree):
|
|
yield from generate(tree.children[0])
|
|
yield ", "
|
|
if len(tree.children) > 1:
|
|
yield from generate(tree.children[1])
|
|
else:
|
|
yield "1"
|
|
|
|
def function_call(tree):
|
|
assert len(tree.children) in {1, 2}
|
|
yield from generate(tree.children[0])
|
|
yield "("
|
|
if len(tree.children) == 2:
|
|
yield from generate(tree.children[1])
|
|
yield ")"
|
|
|
|
def grouping(tree):
|
|
yield "("
|
|
yield from generate(tree.children[0])
|
|
yield ")"
|
|
|
|
def _if(tree):
|
|
yield "if ("
|
|
yield from generate(tree.children[0])
|
|
yield ") "
|
|
yield from generate(tree.children[1])
|
|
|
|
def if_else(tree):
|
|
yield "if ("
|
|
yield from generate(tree.children[0])
|
|
yield ") "
|
|
yield from generate(tree.children[1])
|
|
yield "else "
|
|
yield from generate(tree.children[2])
|
|
|
|
def logical_and(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " && "
|
|
yield from generate(tree.children[1])
|
|
|
|
def logical_or(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " || "
|
|
yield from generate(tree.children[1])
|
|
|
|
def member(tree):
|
|
yield from generate(tree.children[0])
|
|
yield "."
|
|
yield from generate(tree.children[1])
|
|
|
|
def subscript(tree):
|
|
yield from generate(tree.children[0])
|
|
yield "["
|
|
yield from generate(tree.children[1])
|
|
yield "]"
|
|
|
|
def throw(tree):
|
|
yield "return "
|
|
yield from generate(tree.children[0])
|
|
yield "(state);\n"
|
|
|
|
def throw_arg(tree):
|
|
yield "return "
|
|
yield from generate(tree.children[0])
|
|
yield "(state, "
|
|
yield from generate(tree.children[1])
|
|
yield ");\n"
|
|
|
|
def unary_complement(tree):
|
|
yield from "~"
|
|
yield from generate(tree.children[0])
|
|
|
|
def unary_int(tree):
|
|
yield "unary_int("
|
|
yield from generate(tree.children[0])
|
|
yield ")"
|
|
|
|
def unary_negation(tree):
|
|
yield "-"
|
|
yield from generate(tree.children[0])
|
|
|
|
def unary_not(tree):
|
|
yield "!"
|
|
yield from generate(tree.children[0])
|
|
|
|
#
|
|
def addition(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " + "
|
|
yield from generate(tree.children[1])
|
|
|
|
def division(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " / "
|
|
yield from generate(tree.children[1])
|
|
|
|
def equality_equal(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " == "
|
|
yield from generate(tree.children[1])
|
|
|
|
def equality_not_equal(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " != "
|
|
yield from generate(tree.children[1])
|
|
|
|
def greater_than(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " > "
|
|
yield from generate(tree.children[1])
|
|
|
|
def greater_than_equal(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " >= "
|
|
yield from generate(tree.children[1])
|
|
|
|
def left_shift(tree):
|
|
yield from generate(tree.children[0])
|
|
# hack for left shift by LHS constant
|
|
if type(tree.children[0]) is IntegerConstant:
|
|
yield "LL"
|
|
yield " << "
|
|
yield from generate(tree.children[1])
|
|
|
|
def less_than(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " < "
|
|
yield from generate(tree.children[1])
|
|
|
|
def less_than_equal(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " <= "
|
|
yield from generate(tree.children[1])
|
|
|
|
def multiplication(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " * "
|
|
yield from generate(tree.children[1])
|
|
|
|
def right_shift(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " >> "
|
|
yield from generate(tree.children[1])
|
|
|
|
def subtraction(tree):
|
|
yield from generate(tree.children[0])
|
|
yield " - "
|
|
yield from generate(tree.children[1])
|
|
|
|
def declaration(tree):
|
|
assert len(tree.children) >= 2, tree
|
|
yield from generate(tree.children[0])
|
|
yield " "
|
|
for child in tree.children[1:-1]:
|
|
yield from generate(child)
|
|
yield ", "
|
|
yield from generate(tree.children[-1])
|
|
|
|
def unary_reference(tree):
|
|
yield "&"
|
|
assert len(tree.children) == 1
|
|
yield from generate(tree.children[0])
|
|
|
|
def identifier(token):
|
|
yield token.token
|
|
|
|
def constant(elem):
|
|
if elem.token.lower() in {"0x00000000", "0x3f800000"}:
|
|
# hack for fldi0/fldi1
|
|
yield "(float32_t){ "
|
|
yield elem.token.lower()
|
|
yield " }"
|
|
else:
|
|
yield elem.token.lower()
|
|
|
|
def generate(elem):
|
|
mapping = {
|
|
"argument_list": argument_list,
|
|
"assignment_list": assignment_list,
|
|
"assignment": assignment,
|
|
"bit_extraction": bit_extraction,
|
|
"bitwise_and": bitwise_and,
|
|
"bitwise_or": bitwise_or,
|
|
"bitwise_xor": bitwise_xor,
|
|
"block_item_list": block_item_list,
|
|
"compound_statement": compound_statement,
|
|
"expression_statement": expression_statement,
|
|
"for_expression": for_expression,
|
|
"function_call": function_call,
|
|
"grouping": grouping,
|
|
"if": _if,
|
|
"if_else": if_else,
|
|
"logical_and": logical_and,
|
|
"logical_or": logical_or,
|
|
"member": member,
|
|
"subscript": subscript,
|
|
"throw": throw,
|
|
"throw_arg": throw_arg,
|
|
"unary_complement": unary_complement,
|
|
"unary_int": unary_int,
|
|
"unary_negation": unary_negation,
|
|
"unary_not": unary_not,
|
|
#
|
|
"addition": addition,
|
|
"division": division,
|
|
"equality_equal": equality_equal,
|
|
"equality_not_equal": equality_not_equal,
|
|
"greater_than": greater_than,
|
|
"greater_than_equal": greater_than_equal,
|
|
"left_shift": left_shift,
|
|
"less_than": less_than,
|
|
"less_than_equal": less_than_equal,
|
|
"multiplication": multiplication,
|
|
"right_shift": right_shift,
|
|
"subtraction": subtraction,
|
|
#
|
|
"declaration": declaration,
|
|
"unary_reference": unary_reference,
|
|
}
|
|
if type(elem) is Tree:
|
|
yield from mapping[elem.operation](elem)
|
|
elif type(elem) is Identifier:
|
|
yield from identifier(elem)
|
|
elif type(elem) is IntegerConstant:
|
|
yield from constant(elem)
|
|
else:
|
|
assert False, type(elem)
|