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

Unified 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, 2 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/bindings/parser/mojo_parser.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/bindings/parser/mojo_translate.py
diff --git a/mojo/public/bindings/parser/mojo_translate.py b/mojo/public/bindings/parser/mojo_translate.py
new file mode 100755
index 0000000000000000000000000000000000000000..c562b528661240878c37b337d7eef445ddf6aeb2
--- /dev/null
+++ b/mojo/public/bindings/parser/mojo_translate.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Translate parse tree to Mojom IR"""
+
+
+import sys
+
+
+def MapKind(kind):
+ # todo: add more types
+ map_to_kind = { 'bool': 'b',
+ 'int8': 'i8',
+ 'int16': 'i16',
+ 'int32': 'i32',
+ 'int64': 'i64',
+ 'uint8': 'u8',
+ 'uint16': 'u16',
+ 'uint32': 'u32',
+ 'uint64': 'u64',
+ 'string': 's',
+ 'handle': 'h' }
+ if kind.endswith('[]'):
+ return 'a:' + MapKind(kind[0:len(kind)-2])
+ if kind in map_to_kind:
+ return map_to_kind[kind]
+ return 'x:' + kind
+
+
+def MapOrdinal(ordinal):
+ return int(ordinal[1:]) # Strip leading '@'
+
+
+def MapFields(fields):
+ out = []
+ for field in fields:
+ if field[0] == 'FIELD':
+ out.append({'name': field[2],
+ 'kind': MapKind(field[1]),
+ 'ordinal': MapOrdinal(field[3])})
+ return out
+
+
+def MapParameters(parameters):
+ out = []
+ for parameter in parameters:
+ if parameter[0] == 'PARAM':
+ out.append({'name': parameter[2],
+ 'kind': MapKind(parameter[1]),
+ 'ordinal': MapOrdinal(parameter[3])})
+ return out
+
+
+def MapMethods(methods):
+ out = []
+ for method in methods:
+ if method[0] == 'METHOD':
+ out.append({'name': method[1],
+ 'parameters': MapParameters(method[2]),
+ 'ordinal': MapOrdinal(method[3])})
+ return out
+
+
+class MojomBuilder():
+
+ def __init__(self):
+ self.mojom = {}
+
+ def AddStruct(self, name, attributes, fields):
+ struct = {}
+ struct['name'] = name
+ struct['fields'] = MapFields(fields)
+ self.mojom['structs'].append(struct)
+ # TODO(darin): Add support for |attributes|
+
+ def AddInterface(self, name, methods):
+ interface = {}
+ interface['name'] = name
+ interface['methods'] = MapMethods(methods)
+ self.mojom['interfaces'].append(interface)
+
+ def AddModule(self, name, contents):
+ self.mojom['name'] = name
+ self.mojom['namespace'] = name
+ self.mojom['structs'] = []
+ self.mojom['interfaces'] = []
+ for item in contents:
+ if item[0] == 'STRUCT':
+ self.AddStruct(name=item[1], attributes=item[2], fields=item[3])
+ elif item[0] == 'INTERFACE':
+ self.AddInterface(name=item[1], methods=item[2])
+
+ def Build(self, tree):
+ if tree[0] == 'MODULE':
+ self.AddModule(name=tree[1], contents=tree[2])
+ return self.mojom
+
+
+def Translate(tree):
+ return MojomBuilder().Build(tree)
+
+
+def Main():
+ if len(sys.argv) < 2:
+ print("usage: %s filename" % (sys.argv[0]))
+ sys.exit(1)
+ tree = eval(open(sys.argv[1]).read())
+ result = Translate(tree)
+ print(result)
+
+
+if __name__ == '__main__':
+ Main()
« 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