|  | #!/usr/bin/env python | 
|  | # Copyright (c) 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. | 
|  |  | 
|  | """ Lexer for PPAPI IDL | 
|  |  | 
|  | The lexer uses the PLY library to build a tokenizer which understands both | 
|  | WebIDL and Pepper tokens. | 
|  |  | 
|  | WebIDL, and WebIDL regular expressions can be found at: | 
|  | http://www.w3.org/TR/2012/CR-WebIDL-20120419/ | 
|  | PLY can be found at: | 
|  | http://www.dabeaz.com/ply/ | 
|  | """ | 
|  |  | 
|  | from idl_lexer import IDLLexer | 
|  |  | 
|  |  | 
|  | # | 
|  | # IDL PPAPI Lexer | 
|  | # | 
|  | class IDLPPAPILexer(IDLLexer): | 
|  | # Token definitions | 
|  | # | 
|  | # These need to be methods for lexer construction, despite not using self. | 
|  | # pylint: disable=R0201 | 
|  |  | 
|  | # Special multi-character operators | 
|  | def t_LSHIFT(self, t): | 
|  | r'<<' | 
|  | return t | 
|  |  | 
|  | def t_RSHIFT(self, t): | 
|  | r'>>' | 
|  | return t | 
|  |  | 
|  | def t_INLINE(self, t): | 
|  | r'\#inline (.|\n)*?\#endinl.*' | 
|  | self.AddLines(t.value.count('\n')) | 
|  | return t | 
|  |  | 
|  | # Return a "preprocessor" inline block | 
|  | def __init__(self): | 
|  | IDLLexer.__init__(self) | 
|  | self._AddTokens(['INLINE', 'LSHIFT', 'RSHIFT']) | 
|  | self._AddKeywords(['label', 'struct']) | 
|  |  | 
|  | # Add number types | 
|  | self._AddKeywords(['char', 'int8_t', 'int16_t', 'int32_t', 'int64_t']) | 
|  | self._AddKeywords(['uint8_t', 'uint16_t', 'uint32_t', 'uint64_t']) | 
|  | self._AddKeywords(['double_t', 'float_t']) | 
|  |  | 
|  | # Add handle types | 
|  | self._AddKeywords(['handle_t', 'PP_FileHandle']) | 
|  |  | 
|  | # Add pointer types (void*, char*, const char*, const void*) | 
|  | self._AddKeywords(['mem_t', 'str_t', 'cstr_t', 'interface_t']) | 
|  |  | 
|  | # Remove JS types | 
|  | self._DelKeywords(['boolean', 'byte', 'ByteString', 'Date', 'DOMString', | 
|  | 'double', 'float', 'long', 'object', 'octet', 'Promise', | 
|  | 'RegExp', 'short', 'unsigned']) | 
|  |  | 
|  |  | 
|  | # If run by itself, attempt to build the lexer | 
|  | if __name__ == '__main__': | 
|  | lexer = IDLPPAPILexer() | 
|  | lexer.Tokenize(open('test_parser/inline_ppapi.idl').read()) | 
|  | for tok in lexer.GetTokens(): | 
|  | print '\n' + str(tok) |