Index: mojo/public/bindings/parser/mojo_parser.py |
diff --git a/mojo/public/bindings/parser/mojo_parser.py b/mojo/public/bindings/parser/mojo_parser.py |
deleted file mode 100755 |
index 9bc94896e0c873ca11848be2ff7b17001fcab283..0000000000000000000000000000000000000000 |
--- a/mojo/public/bindings/parser/mojo_parser.py |
+++ /dev/null |
@@ -1,235 +0,0 @@ |
-#!/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. |
- |
-"""Generates a syntax tree from a Mojo IDL file.""" |
- |
- |
-import sys |
-import os.path |
- |
- |
-# Try to load the ply module, if not, then assume it is in the third_party |
-# directory. |
-try: |
- # Disable lint check which fails to find the ply module. |
- # pylint: disable=F0401 |
- from ply import lex |
- from ply import yacc |
-except ImportError: |
- module_path, module_name = os.path.split(__file__) |
- third_party = os.path.join( |
- module_path, os.pardir, os.pardir, os.pardir, os.pardir, 'third_party') |
- sys.path.append(third_party) |
- # pylint: disable=F0401 |
- from ply import lex |
- from ply import yacc |
- |
- |
-def ListFromConcat(*items): |
- """Generate list by concatenating inputs""" |
- itemsout = [] |
- for item in items: |
- if item is None: |
- continue |
- if type(item) is not type([]): |
- itemsout.append(item) |
- else: |
- itemsout.extend(item) |
- |
- return itemsout |
- |
- |
-class Lexer(object): |
- |
- # This field is required by lex to specify the complete list of valid tokens. |
- tokens = ( |
- 'NAME', |
- 'NUMBER', |
- |
- 'ARRAY', |
- 'ORDINAL', |
- |
- 'MODULE', |
- 'STRUCT', |
- 'INTERFACE', |
- 'VOID', |
- |
- 'LCURLY', |
- 'RCURLY', |
- 'LPAREN', |
- 'RPAREN', |
- 'LBRACKET', |
- 'RBRACKET', |
- 'COMMA', |
- 'SEMICOLON', |
- 'EQUALS', |
- ) |
- |
- t_LCURLY = r'{' |
- t_RCURLY = r'}' |
- t_LPAREN = r'\(' |
- t_RPAREN = r'\)' |
- t_LBRACKET = r'\[' |
- t_RBRACKET = r'\]' |
- t_COMMA = r',' |
- t_SEMICOLON = r';' |
- t_EQUALS = r'=' |
- t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' |
- t_ARRAY = r'[a-zA-Z_][a-zA-Z0-9_]*\[\]' |
- t_NUMBER = r'\d+' |
- t_ORDINAL = r'@[0-9]*' |
- |
- def t_MODULE(self, t): |
- r'module' |
- return t |
- |
- def t_STRUCT(self, t): |
- r'struct' |
- return t |
- |
- def t_INTERFACE(self, t): |
- r'interface' |
- return t |
- |
- def t_VOID(self, t): |
- r'void' |
- return t |
- |
- # Ignore C and C++ style comments |
- def t_COMMENT(self, t): |
- r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)' |
- pass |
- |
- # Ignored characters |
- t_ignore = " \t" |
- |
- def t_newline(self, t): |
- r'\n+' |
- t.lexer.lineno += t.value.count("\n") |
- |
- def t_error(self, t): |
- print("Illegal character '%s'" % t.value[0]) |
- t.lexer.skip(1) |
- |
- |
-class Parser(object): |
- |
- def __init__(self, lexer): |
- self.tokens = lexer.tokens |
- |
- def p_module(self, p): |
- """module : MODULE NAME LCURLY definitions RCURLY""" |
- p[0] = ('MODULE', p[2], p[4]) |
- |
- def p_definitions(self, p): |
- """definitions : definition definitions |
- |""" |
- if len(p) > 1: |
- p[0] = ListFromConcat(p[1], p[2]) |
- |
- def p_definition(self, p): |
- """definition : struct |
- | interface""" |
- p[0] = p[1] |
- |
- def p_attribute_section(self, p): |
- """attribute_section : LBRACKET attributes RBRACKET |
- | """ |
- if len(p) > 3: |
- p[0] = p[2] |
- |
- def p_attributes(self, p): |
- """attributes : attribute |
- | attribute COMMA attributes |
- | """ |
- if len(p) == 2: |
- p[0] = ListFromConcat(p[1]) |
- elif len(p) > 3: |
- p[0] = ListFromConcat(p[1], p[3]) |
- |
- def p_attribute(self, p): |
- """attribute : NAME EQUALS NUMBER |
- | NAME EQUALS NAME""" |
- p[0] = ('ATTRIBUTE', p[1], p[3]) |
- |
- def p_struct(self, p): |
- """struct : attribute_section STRUCT NAME LCURLY fields RCURLY SEMICOLON""" |
- p[0] = ('STRUCT', p[3], p[1], p[5]) |
- |
- def p_fields(self, p): |
- """fields : field fields |
- |""" |
- if len(p) > 1: |
- p[0] = ListFromConcat(p[1], p[2]) |
- |
- def p_field(self, p): |
- """field : typename NAME ordinal SEMICOLON""" |
- p[0] = ('FIELD', p[1], p[2], p[3]) |
- |
- def p_interface(self, p): |
- """interface : attribute_section INTERFACE NAME LCURLY methods RCURLY SEMICOLON""" |
- p[0] = ('INTERFACE', p[3], p[1], p[5]) |
- |
- def p_methods(self, p): |
- """methods : method methods |
- | """ |
- if len(p) > 1: |
- p[0] = ListFromConcat(p[1], p[2]) |
- |
- def p_method(self, p): |
- """method : VOID NAME LPAREN parameters RPAREN ordinal SEMICOLON""" |
- p[0] = ('METHOD', p[2], p[4], p[6]) |
- |
- def p_parameters(self, p): |
- """parameters : parameter |
- | parameter COMMA parameters |
- | """ |
- if len(p) == 1: |
- p[0] = [] |
- elif len(p) == 2: |
- p[0] = ListFromConcat(p[1]) |
- elif len(p) > 3: |
- p[0] = ListFromConcat(p[1], p[3]) |
- |
- def p_parameter(self, p): |
- """parameter : typename NAME ordinal""" |
- p[0] = ('PARAM', p[1], p[2], p[3]) |
- |
- def p_typename(self, p): |
- """typename : NAME |
- | ARRAY""" |
- p[0] = p[1] |
- |
- def p_ordinal(self, p): |
- """ordinal : ORDINAL |
- | """ |
- if len(p) > 1: |
- p[0] = p[1] |
- |
- def p_error(self, e): |
- print('error: %s'%e) |
- |
- |
-def Parse(filename): |
- lexer = Lexer() |
- parser = Parser(lexer) |
- |
- lex.lex(object=lexer) |
- yacc.yacc(module=parser, debug=0, write_tables=0) |
- |
- tree = yacc.parse(open(filename).read()) |
- return tree |
- |
- |
-def Main(): |
- if len(sys.argv) < 2: |
- print("usage: %s filename" % (sys.argv[0])) |
- sys.exit(1) |
- tree = Parse(filename=sys.argv[1]) |
- print(tree) |
- |
- |
-if __name__ == '__main__': |
- Main() |