Mercurial > hg > CbC > old > CbC_scripts
annotate meta_connector/meta_connector.py @ 26:b9f88346cecd support auto stub generation
generate stub
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 02 Nov 2015 04:02:13 +0900 |
parents | 9a1cce532f29 |
children | 894a300f199f |
rev | line source |
---|---|
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 import sys |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 import argparse |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 import re |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 # parse arguments and return arguments list. |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 def get_args(): |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 parser = argparse.ArgumentParser( |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 formatter_class=argparse.RawDescriptionHelpFormatter, |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 description="""\ |
25
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
13 Parse meta connect syntax and create stub. Default output is stdout. |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 sample) |
8 | 16 __code code0(struct Data data1, ...){ |
17 goto code1(data1, data2, ...); | |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 \t| |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 \tV |
8 | 20 __code code0(struct Context* context, struct Data data1, ...){ |
21 goto meta_code1(context, data1, data2, ..., Code1); | |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 """) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 parser.add_argument('input_file',\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 nargs=None,\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 type=str,\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 help='input file path.') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 parser.add_argument('-o', dest='output',\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 nargs=1,\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 type=str,\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 metavar='<file>',\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 help='write output to <file>') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 return parser.parse_args() |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 # parse input file and create meta connection list |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 def parse_meta_syntax(lines,file): |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 comment_out = False |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 caller_name = '' |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
39 isMetaOrStub = False |
20
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
40 defaultMetaIsNotExist = True |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 for i,l in enumerate(lines): |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 regexed_l = re.search(r"[a-zA-Z0-9_]+ *\(",l) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 # get caller code segment name |
24 | 45 if re.search(r"^ *__code",l) is not None: # code segment declarations. |
17
77c1716f7aff
fix meta connection at no arg code segments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
46 isMetaOrStub = False |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 caller_name = regexed_l.group(0).rstrip('(') |
24 | 48 args = get_args_from_line(l) |
20
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
49 if caller_name == 'meta': |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
50 defaultMetaIsNotExist = False |
24 | 51 if re.search(r"^ *meta_*|stub$",caller_name) is not None: # meta code segments or stubs |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
52 isMetaOrStub = True |
24 | 53 elif not cs_search(lines, caller_name+'_stub'): # normal code segments which do not have a stub. |
54 create_stub(file, caller_name, args.strip(',')) | |
55 | |
56 if re.search(r"struct Context\* context",l) is None: # add context to arguments list if it didn't have. | |
9
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
57 file.write("/*-- generated by script */\n") |
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
58 file.write('// '+l) |
24 | 59 file.write('__code {0:s}(struct Context* context{1:s}) {{\n'.format(caller_name, args)) |
22
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
60 else: |
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
61 file.write(l) |
24 | 62 elif not isMetaOrStub and regexed_l is not None and re.search(r"^ *goto",l): # code segment transition. |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 callee_name = regexed_l.group(0).rstrip('(') |
16
f748d295b08f
fix start_code bug
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
64 if callee_name == 'start_code' or re.match('meta_|meta$',callee_name): |
10
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
65 file.write(l) |
23 | 66 elif re.search(r"\(context", l) is None: |
25
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
67 connect_meta(file, lines, l, caller_name, callee_name) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
68 # file.write("/*-- connected by script */\n") |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
69 # file.write('// '+l) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
70 # meta_name = 'meta_'+caller_name if cs_search(lines, 'meta_'+callee_name) else 'meta' |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
71 # file.write("goto {0:s}(context{1:s}, {2:s});\n".format(meta_name, args,\ |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
72 # callee_name.capitalize())) |
23 | 73 else: |
74 file.write(l) | |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 else: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 file.write(l) |
20
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
77 if defaultMetaIsNotExist: |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
78 create_default_metacs(file) |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
79 |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
80 def create_default_metacs(file): |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
81 file.write(''' |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
82 __code meta(struct Context* context, enum Code next) { |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
83 goto (context->code[next])(context); |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
84 } |
e06b47585c4f
generate default meta code segment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
85 ''') |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 |
19 | 87 def get_args_from_line(line): |
88 args = line.split('(')[1].rsplit(')')[0].strip() | |
89 args = ', ' + args if args else '' | |
90 return args | |
91 | |
92 | |
24 | 93 def create_stub(file, name, args): |
22
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
94 file.write('''__code {0:s}_stub(struct Context* context) {{ |
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
95 goto {0:s}(context'''.format(name)) |
24 | 96 for arg in args_str2args_list(args): |
97 file.write(', &context->data['+arg.capitalize()+']->'+arg) | |
22
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
98 file.write(');\n}\n') |
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
99 |
25
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
100 def connect_meta(file, lines, l, caller_name, callee_name): |
26 | 101 meta_name = 'meta_'+caller_name if cs_search(lines, 'meta_'+caller_name) else 'meta' |
25
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
102 args = get_args_from_line(l) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
103 file.write("/*-- connected by script */\n") |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
104 file.write('// '+l) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
105 file.write("goto {0:s}(context".format(meta_name)) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
106 for arg in args_str2args_list(args): |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
107 file.write(', '+arg) |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
108 file.write(', '+callee_name.capitalize()+');\n') |
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
109 |
24 | 110 def args_str2args_list(args_str): |
111 args_list = [] | |
112 temporary_list = args_str.split() | |
113 for i,arg in enumerate(temporary_list): | |
114 if re.search(r"context,*", arg) is not None: | |
115 continue | |
25
9a1cce532f29
fix meta connection bugs
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
116 if re.search(r"[a-zA-Z0-9_] *,$", arg) is not None or i == len(temporary_list)-1: |
24 | 117 args_list.append(arg.strip(',')) |
118 return args_list | |
119 | |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
120 # search meta code segment. |
24 | 121 # It returns true when cs was found. |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
122 # Find it : __code meta_'name' |
22
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
123 def cs_search(lines, name): |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
124 for l in lines: |
22
c32994789739
allow to write context in arguments list at code segment declaration.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
125 if re.search(r"^ *__code {0:s}\(".format(name),l) is not None: |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
126 return True |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
127 return False |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
128 |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 def main(): |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 args = get_args() |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 output = sys.stdout |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 try: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 f = open(args.input_file,'r') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 except IOError: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 print("cannot open file %s" % input_file) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 if args.output is not None: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 try: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 output = open(args.output[0],'w') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 except IOError: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 print("cannot open file %s" % args.output) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 lines = f.readlines() |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 connect_list = parse_meta_syntax(lines, output) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 main() |