Ai
1 Star 2 Fork 0

liuzhongkai/code-generator

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
main.py 4.07 KB
一键复制 编辑 原始数据 按行查看 历史
lzk 提交于 2021-11-21 17:03 +08:00 . code genarator
import sys
import os
import io
import argparse
from itertools import chain
def key_value_pair(line):
key, value = line.split("=", 1)
try:
value = int(value)
except:
pass
return key, value
def get_indent(str):
# get indent length
index = 0
for i in str:
if i == " ":
index += 1
else:
break
return index
def print_line(line):
global python_indent
global generate_code_indent
if line.strip()[0] == "}" or line.strip()[0] == ")":
python_indent = -1
split_str = line.split("@")
if line.strip()[0] != "@" and len(split_str) == 1:
if get_indent(line) != python_indent and python_indent != -1:
pass
else:
result = ["print(", line, ", file=OUT_STREAM)"]
python_indent = -1
if "{" in line or "asm volatile(" in line:
generate_code_indent = get_indent(line)
if line.strip().startswith("}") and "{" not in line:
generate_code_indent -= 4
if (len(line) == 1 and line[0] == "}"):
# modify next fun generate_code_indent
generate_code_indent = -4
return "\"".join(result)
if line.strip()[0] == '@':
# get python indent and first generate_code_indent
if python_indent == -1:
generate_code_indent = get_indent(line) - 4
python_indent = get_indent(line)
result = split_str[0][python_indent:] + split_str[1]
return result
else:
index = get_indent(split_str[0])
result = [split_str[0][python_indent:index] + "print("]
Prefix = " " * (generate_code_indent + 4) + split_str[0].lstrip()
Suffix = " %("
for str in split_str[1:]:
second = str.find("}")
Suffix += str[1:second] + ', '
str = str.replace(str[0:second + 1], "%d")
Prefix += str
result.append(Prefix)
result.append(Suffix + "), file=OUT_STREAM)")
return "\"".join(result)
def generate_code(template_file, exec_globals):
if sys.version_info > (3, 0):
output_stream = io.StringIO()
else:
output_stream = io.BytesIO()
with open(template_file, 'r') as f:
generate_code_lines = []
for line in f:
line = line.replace("\n", "")
if len(line.strip()) != 0 and line.strip()[0] != "@":
line = line.replace("\"", "\\\"")
line = line.replace("%", "%%")
if "print" in line:
line = line.replace("%%", "%")
if not len(line):
generate_code_lines.append("print(" + "\"" + line + "\"" + ", file=OUT_STREAM)")
else:
str = print_line(line)
if "%(" not in str:
str = str.replace("%%[", "%[")
generate_code_lines.append(str)
# print('\n'.join(generate_code_lines))
c = compile('\n'.join(generate_code_lines), '', 'exec')
exec_globals["OUT_STREAM"] = output_stream
exec(c, exec_globals)
return output_stream.getvalue()
generate_code_indent = -4
python_indent = -1
parser = argparse.ArgumentParser(description="MSLite NNACL Code Generator")
parser.add_argument("-I", dest="Template_File", nargs=1, help="template file to generate code")
parser.add_argument("-A", dest="defines", metavar="KEY=VALUE", nargs="*", type=key_value_pair, action="append", help="Custom Parameters")
parser.add_argument("-O", dest="Output_File", nargs=1, help="generate code output file path")
if __name__ == "__main__":
parameters = parser.parse_args(sys.argv[1:])
exec_globals = dict(chain(*parameters.defines))
generate_code_str = generate_code(parameters.Template_File[0], exec_globals)
if os.path.exists(parameters.Output_File[0]):
os.remove(parameters.Output_File[0])
saveDir = os.path.dirname(parameters.Output_File[0])
if not os.path.exists(saveDir):
print(saveDir)
os.mkdir(saveDir)
with open(parameters.Output_File[0], "w", encoding='utf-8') as output_file:
output_file.write(generate_code_str)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lzkcode/code-generator.git
git@gitee.com:lzkcode/code-generator.git
lzkcode
code-generator
code-generator
code-ge

搜索帮助