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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ae45108716a2 fix usage
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
16 __code code0(struct Data data1, ...){
ae45108716a2 fix usage
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
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
ae45108716a2 fix usage
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
20 __code code0(struct Context* context, struct Data data1, ...){
ae45108716a2 fix usage
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
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()