-
Notifications
You must be signed in to change notification settings - Fork 0
/
try.py
120 lines (113 loc) · 3.67 KB
/
try.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# SMOP -- Simple Matlab/Octave to Python compiler
# Copyright 2011-2016 Victor Leikehman
import py_compile
import tempfile
import fnmatch
import tarfile
import sys
import os
import traceback
from os.path import basename, splitext
import lexer
import options
import parse
import resolve
import backend
import version
def print_header(fp):
if options.no_header:
return
print >> fp, "# Autogenerated with SMOP " + version.__version__
# print >> fp, "from __future__ import division"
print >> fp, "from smop.core import *"
# if options.link:
# print >> fp, "from %s import *" % options.link
print >> fp, "#", options.filename
def main():
tar = None
if "M" in options.debug:
import pdb
pdb.set_trace()
if not options.filelist:
if options.archive:
tar = tarfile.open(options.archive)
options.filelist = tar.getnames()
elif options.code:
tmp = tempfile.NamedTemporaryFile(suffix=".m")
tmp.file.write(options.code)
tmp.file.flush()
options.filelist = [tmp.name]
if options.output:
print "Conflicting options -c and -o"
return
options.output = "-"
else:
options.parser.print_help()
return
if options.output == "-":
fp = sys.stdout
elif options.output:
fp = open(options.output, "w")
else:
fp = None
if fp:
print_header(fp)
if options.glob_pattern:
options.filelist = fnmatch.filter(options.filelist,
options.glob_pattern)
nerrors = 0
for i, options.filename in enumerate(options.filelist):
try:
if options.verbose:
print i, options.filename
if not options.filename.endswith(".m"):
if options.verbose:
print("\tIgnored: '%s' (unexpected file type)" %
options.filename)
continue
if basename(options.filename) in options.xfiles:
if options.verbose:
print "\tExcluded: '%s'" % options.filename
continue
if tar:
buf = tar.extractfile(options.filename).read()
else:
buf = open(options.filename).read()
buf = buf.replace("\r\n", "\n")
buf = buf.decode("ascii", errors="ignore")
stmt_list = parse.parse(buf if buf[-1] == '\n' else buf + '\n')
#assert None not in stmt_list
if not stmt_list:
continue
if not options.no_resolve:
G = resolve.resolve(stmt_list)
if not options.no_backend:
s = backend.backend(stmt_list)
if not options.output:
f = splitext(basename(options.filename))[0] + ".py"
with open(f, "w") as fp:
print_header(fp)
fp.write(s)
try:
py_compile.compile(f,doraise=True)
if options.execfile:
execfile(f)
except:
if options.delete-on-error:
os.unlink(f)
if options.verbose:
print "Removed",f
raise
else:
fp.write(s)
except KeyboardInterrupt:
break
except:
nerrors += 1
traceback.print_exc(file=sys.stdout)
if options.strict:
break
finally:
print "Errors:", nerrors
if __name__ == "__main__":
main()