Mercurial > hg > CbC > old > CbC_scripts
annotate meta_connector/meta_connector_name.py @ 10:eec116fe2387
default meta connection
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Sep 2015 17:41:47 +0900 |
parents | 185d545a9a8e |
children | 09470e372dda |
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="""\ |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 Parse meta connect syntax. Default output is stdout. |
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 target_cs = False |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 caller_name = '' |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
40 isMetaOrStub = False |
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 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 # get caller code segment name |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 if re.search(r"^ *__code",l) is not None: |
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('(') |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
48 if re.search(r"^ *meta_*|stub$",caller_name) is not None: |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
49 isMetaOrStub = True |
9
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
50 file.write(l) |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 else: |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
52 isMetaOrStub = False |
9
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
53 splited = l.split('(',1) |
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
54 file.write("/*-- generated by script */\n") |
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
55 file.write('// '+l) |
185d545a9a8e
context generation
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
56 file.write('{0:s}(struct Context* context, {1:s}'.format(splited[0],splited[1])) |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
57 elif not isMetaOrStub and regexed_l is not None and re.search(r"^ *goto",l): |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 callee_name = regexed_l.group(0).rstrip('(') |
10
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
59 if callee_name.startswith('meta_'): |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
60 file.write(l) |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
61 else: |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
62 file.write("/*-- connected by script */\n") |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
63 file.write('// '+l) |
10
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
64 args = l.split('(')[1].rsplit(')')[0].strip() |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
65 args = args + ',' if args else '' |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
66 meta_name = 'meta_'+caller_name if meta_search(lines, callee_name) else 'meta' |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
67 file.write("goto {0:s}(context, {1:s} {2:s});\n".format(meta_name, args,\ |
eec116fe2387
default meta connection
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
68 callee_name.capitalize())) |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 else: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 file.write(l) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 |
6
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
72 # search meta code segment. |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
73 # Find it : __code meta_'name' |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
74 def meta_search(lines, name): |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
75 for l in lines: |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
76 if re.search(r"^ *__code +meta_{0:s}\(".format(name),l) is not None: |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
77 return True |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
78 return False |
d9f74f325135
name base: fix meta_stub bug.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
79 |
5
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 def main(): |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 args = get_args() |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 output = sys.stdout |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 try: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 f = open(args.input_file,'r') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 except IOError: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 print("cannot open file %s" % input_file) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 if args.output is not None: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 try: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 output = open(args.output[0],'w') |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 except IOError: |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 print("cannot open file %s" % args.output) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 lines = f.readlines() |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 connect_list = parse_meta_syntax(lines, output) |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 |
7af72e3e4b62
add name base meta connector
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 main() |