import sys
import pycropml.transpiler.generators
import pycropml.transpiler.generators.csharpGenerator
import pycropml.transpiler.generators.cppGenerator
import pycropml.transpiler.generators.cpp2Generator
import pycropml.transpiler.generators.pythonGenerator
import pycropml.transpiler.generators.fortranGenerator
import pycropml.transpiler.generators.javaGenerator
import pycropml.transpiler.generators.simplaceGenerator
import pycropml.transpiler.generators.apsimGenerator
import pycropml.transpiler.generators.recordGenerator
import pycropml.transpiler.generators.dssatGenerator
import pycropml.transpiler.generators.sticsGenerator
import pycropml.transpiler.generators.biomaGenerator
# Sirius is managed by BioMa
import pycropml.transpiler.generators.siriusGenerator
# import pycropml.transpiler.generators.sirius2Generator
import pycropml.transpiler.generators.checkGenerator
import pycropml.transpiler.generators.rGenerator
import pycropml.transpiler.generators.openaleaGenerator
from pycropml.transpiler.Parser import parser
from pycropml.transpiler.ast_transform import AstTransformer, transform_to_syntax_tree
import os
from path import Path
languages = [
'r', 'cs', 'cpp', "cpp2", 'py', 'f90', 'java', 'simplace', 'sirius', # 'sirius','sirius2',
'openalea', 'check', 'apsim', 'record', 'dssat', 'stics', 'bioma']
NAMES = {
'r': 'r',
'cs': 'csharp',
'cpp': 'cpp',
"cpp2": "cpp2",
'py': 'python',
'f90': 'fortran',
'java': 'java',
'simplace': 'simplace',
#'sirius':'sirius',
# "sirius2":"sirius2",
'openalea': 'openalea',
'check': 'check',
'apsim': 'apsim',
'sirius': 'sirius',
"record": "record",
"dssat": "dssat",
"stics": "stics",
"bioma": "bioma"
}
GENERATORS = {
format_: getattr(
getattr(
pycropml.transpiler.generators,
'%sGenerator' % NAMES[format_]),
'%sGenerator' % NAMES[format_].capitalize())
for format_ in languages
}
COMPOSERS = {
format_: getattr(
getattr(
pycropml.transpiler.generators,
'%sGenerator' % NAMES[format_]),
'%sCompo' % NAMES[format_].capitalize())
for format_ in languages
}
[docs]
class Main:
def __init__(self, file, language, models=None, name=None):
self.file = file
self.language = language
self.models = models
if sys.version_info[0] > 3:
self.path = os.path.abspath(file)
else:
self.path = Path(self.file)
self.file = self.file
self.name = name
self.tree = None
self.newtree = None
self.dictAst = None
self.nodeAst = None
[docs]
def parse(self):
self.tree = parser(self.file)
return self.tree
[docs]
def to_ast(self, source):
self.newtree = AstTransformer(self.tree, source, self.models)
self.dictAst = self.newtree.transformer()
self.nodeAst = transform_to_syntax_tree(self.dictAst)
return self.nodeAst
[docs]
def to_source(self):
generator = GENERATORS[self.language](self.nodeAst, self.models, self.name)
# node = self.nodeAst.body
node = self.nodeAst
generator.visit(node)
z = ''.join(generator.result)
if self.language == 'f90' or self.language == 'dssat' or self.language == 'stics':
z = formater(z)
return z
[docs]
def translate(self):
generator = COMPOSERS[self.language](self.nodeAst, self.models, self.name)
node = self.nodeAst
generator.visit(node)
z = ''.join(generator.result)
if self.language == 'f90' or self.language == 'dssat' or self.language == 'stics':
z = formater(z)
return z