incomp-flame-post/code/code_gen/code_gen.py
2019-05-23 11:47:42 +09:00

119 lines
2.7 KiB
Python

from lark import Lark, Visitor, Transformer, v_args, Token
from post import *
calc_grammar = """
?varlist: "[" [NAME ("," NAME)*] "]"
?start: statement*
?statement: NAME "=" sum -> assign_var
| avg "{" [NAME ("," NAME)*] "}" -> assign_avg_var
| varlist
?sum: product
| sum "+" product -> add
| sum "-" product -> sub
?product: atom
| product "*" atom -> mul
| product "/" atom -> div
?atom: NUMBER -> number
| "-" atom -> neg
| NAME -> var
| NAME "'" -> fluc
| "$" NAME -> env
| "(" sum ")"
| inlinefunc "(" sum ")" -> icall
| mathfunc "(" sum ")" -> fcall
| derivative "(" NAME ")" -> dnx
avg: "avg" [NAME]
?inlinefunc: "sqr" -> sqr
| "pow3" -> pow3
?mathfunc: "log" -> log
| "exp" -> exp
| "sqrt" -> sqrt
| "abs" -> abs
| "rxn_rate" -> rxn_rate
?derivative: "ddx" -> ddx
| "d2dx" -> d2dx
| "ddy" -> ddy
| "d2dy" -> d2dy
| "ddz" -> ddz
| "d2dz" -> d2dz
%import common.CNAME -> NAME
%import common.NUMBER
%import common.WS
%ignore WS
"""
class VersionInfo(object):
def __init__ (self, input_raw):
import os, datetime
import subprocess as sp
bd = 'character (len=*), parameter :: build_date="{}"'
bb = 'character (len=*), parameter :: build_base="{}"'
self.build_date = bd.format(datetime.datetime.today().ctime())
try:
self.build_base = bb.format(sp.check_output(["git", "rev-parse", "HEAD"]).strip())
except subprocess.CalledProcessError:
self.build_base = "None"
tinfo = 'character (len=*), parameter :: term_info={}'
self.lines = input_raw.split(os.linesep)
nl = len(self.lines)
self.term_info = tinfo.format("//char(10)//".join(map('"{}"'.format, self.lines)))
def fparams (self):
return "\n".join([self.build_date, self.build_base, self.term_info])
def test():
with open("resources/m_template.f90") as template_file:
mod_form = template_file.read()
with open("terms.input") as inputfile:
terms_raw = ((inputfile.read()))
tree = Lark(calc_grammar, parser='lalr' ).parse(terms_raw)
ir1 = Stage1(tree)
ir2 = Stage2(ir1)
ir3 = Stage3(ir2)
ir4 = Stage4(ir3)
cdict = ir4.print_program()
print mod_form.format( cdict )
# print mod_form.format( ir4.print_program() )
# print mod_form.format( ir3.print_program() )
# ir4.save_ir()
if __name__ == '__main__':
test()