Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: mojo/public/bindings/parser/mojo_translate.py

Issue 47543003: Mojo: Add basic IDL parser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: A bit more object oriented. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/public/bindings/parser/mojo_parser.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """Translate parse tree to Mojom IR"""
7
8
9 import sys
10
11
12 def MapKind(kind):
13 # todo: add more types
14 map_to_kind = { 'bool': 'b',
15 'int8': 'i8',
16 'int16': 'i16',
17 'int32': 'i32',
18 'int64': 'i64',
19 'uint8': 'u8',
20 'uint16': 'u16',
21 'uint32': 'u32',
22 'uint64': 'u64',
23 'string': 's',
24 'handle': 'h' }
25 if kind.endswith('[]'):
26 return 'a:' + MapKind(kind[0:len(kind)-2])
27 if kind in map_to_kind:
28 return map_to_kind[kind]
29 return 'x:' + kind
30
31
32 def MapOrdinal(ordinal):
33 return int(ordinal[1:]) # Strip leading '@'
34
35
36 def MapFields(fields):
37 out = []
38 for field in fields:
39 if field[0] == 'FIELD':
40 out.append({'name': field[2],
41 'kind': MapKind(field[1]),
42 'ordinal': MapOrdinal(field[3])})
43 return out
44
45
46 def MapParameters(parameters):
47 out = []
48 for parameter in parameters:
49 if parameter[0] == 'PARAM':
50 out.append({'name': parameter[2],
51 'kind': MapKind(parameter[1]),
52 'ordinal': MapOrdinal(parameter[3])})
53 return out
54
55
56 def MapMethods(methods):
57 out = []
58 for method in methods:
59 if method[0] == 'METHOD':
60 out.append({'name': method[1],
61 'parameters': MapParameters(method[2]),
62 'ordinal': MapOrdinal(method[3])})
63 return out
64
65
66 class MojomBuilder():
67
68 def __init__(self):
69 self.mojom = {}
70
71 def AddStruct(self, name, attributes, fields):
72 struct = {}
73 struct['name'] = name
74 struct['fields'] = MapFields(fields)
75 self.mojom['structs'].append(struct)
76 # TODO(darin): Add support for |attributes|
77
78 def AddInterface(self, name, methods):
79 interface = {}
80 interface['name'] = name
81 interface['methods'] = MapMethods(methods)
82 self.mojom['interfaces'].append(interface)
83
84 def AddModule(self, name, contents):
85 self.mojom['name'] = name
86 self.mojom['namespace'] = name
87 self.mojom['structs'] = []
88 self.mojom['interfaces'] = []
89 for item in contents:
90 if item[0] == 'STRUCT':
91 self.AddStruct(name=item[1], attributes=item[2], fields=item[3])
92 elif item[0] == 'INTERFACE':
93 self.AddInterface(name=item[1], methods=item[2])
94
95 def Build(self, tree):
96 if tree[0] == 'MODULE':
97 self.AddModule(name=tree[1], contents=tree[2])
98 return self.mojom
99
100
101 def Translate(tree):
102 return MojomBuilder().Build(tree)
103
104
105 def Main():
106 if len(sys.argv) < 2:
107 print("usage: %s filename" % (sys.argv[0]))
108 sys.exit(1)
109 tree = eval(open(sys.argv[1]).read())
110 result = Translate(tree)
111 print(result)
112
113
114 if __name__ == '__main__':
115 Main()
OLDNEW
« no previous file with comments | « mojo/public/bindings/parser/mojo_parser.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698