Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 PLY: | 47 PLY: |
| 48 http://www.dabeaz.com/ply/ | 48 http://www.dabeaz.com/ply/ |
| 49 """ | 49 """ |
| 50 | 50 |
| 51 # Disable attribute validation, as lint can't import parent class to check | 51 # Disable attribute validation, as lint can't import parent class to check |
| 52 # pylint: disable=E1101 | 52 # pylint: disable=E1101 |
| 53 | 53 |
| 54 import os.path | 54 import os.path |
| 55 import sys | 55 import sys |
| 56 | 56 |
| 57 # PLY is in Chromium src/third_party/ply | |
| 58 module_path, module_name = os.path.split(__file__) | |
| 59 third_party = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pard ir) | |
| 60 # Insert at front to override system libraries, and after path[0] == script dir | |
| 61 sys.path.insert(1, third_party) | |
| 62 from ply import lex | |
| 63 | |
| 57 # Base lexer is in Chromium src/tools/idl_parser | 64 # Base lexer is in Chromium src/tools/idl_parser |
| 58 module_path, module_name = os.path.split(__file__) | 65 tools_dir = os.path.join(third_party, os.pardir, 'tools') |
| 59 tools_dir = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pardir , os.pardir, 'tools') | |
| 60 sys.path.append(tools_dir) | 66 sys.path.append(tools_dir) |
| 61 | |
| 62 from idl_parser.idl_lexer import IDLLexer | 67 from idl_parser.idl_lexer import IDLLexer |
| 63 | 68 |
| 64 REMOVE_TOKENS = ['COMMENT'] | 69 REMOVE_TOKENS = ['COMMENT'] |
| 65 | 70 |
| 66 | 71 |
| 67 class BlinkIDLLexer(IDLLexer): | 72 class BlinkIDLLexer(IDLLexer): |
| 68 # ignore comments | 73 # ignore comments |
| 69 def t_COMMENT(self, t): | 74 def t_COMMENT(self, t): |
| 70 r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)' | 75 r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)' |
| 71 self.AddLines(t.value.count('\n')) | 76 self.AddLines(t.value.count('\n')) |
| 72 | 77 |
| 73 # Analogs to _AddToken/_AddTokens in base lexer | 78 # Analogs to _AddToken/_AddTokens in base lexer |
| 74 # Needed to remove COMMENT token, since comments ignored | 79 # Needed to remove COMMENT token, since comments ignored |
| 75 def _RemoveToken(self, token): | 80 def _RemoveToken(self, token): |
| 76 if token in self.tokens: | 81 if token in self.tokens: |
| 77 self.tokens.remove(token) | 82 self.tokens.remove(token) |
| 78 | 83 |
| 79 def _RemoveTokens(self, tokens): | 84 def _RemoveTokens(self, tokens): |
| 80 for token in tokens: | 85 for token in tokens: |
| 81 self._RemoveToken(token) | 86 self._RemoveToken(token) |
| 82 | 87 |
| 83 def __init__(self): | 88 def __init__(self, debug=False, outputdir=None, optimize=True): |
|
haraken
2014/03/06 07:58:41
Do we need to distinguish |debug| and |optimize| ?
Nils Barth (inactive)
2014/03/06 08:09:47
Yes, in general: these 3 are possible: FT, FF, TF
| |
| 89 if debug: | |
| 90 # Turn off optimization and caching to help debugging | |
| 91 optimize = False | |
| 92 outputdir = None | |
| 93 if outputdir: | |
| 94 # Need outputdir in path because lex imports the cached lex table | |
| 95 # as a Python module | |
| 96 sys.path.append(outputdir) | |
| 97 | |
| 84 IDLLexer.__init__(self) | 98 IDLLexer.__init__(self) |
| 99 # Overrides to parent class | |
| 85 self._RemoveTokens(REMOVE_TOKENS) | 100 self._RemoveTokens(REMOVE_TOKENS) |
| 101 # Optimized mode substantially decreases startup time (by disabling | |
| 102 # error checking), and also allows use of Python's optimized mode. | |
| 103 # See: Optimized Mode | |
| 104 # http://www.dabeaz.com/ply/ply.html#ply_nn15 | |
| 105 self._lexobj = lex.lex(object=self, | |
| 106 debug=debug, | |
| 107 optimize=optimize, | |
| 108 outputdir=outputdir) | |
| 86 | 109 |
| 87 | 110 |
| 88 # If run by itself, attempt to build the lexer | 111 ################################################################################ |
| 112 | |
| 113 def main(argv): | |
| 114 # If file itself executed, build and cache lex table | |
| 115 try: | |
| 116 outputdir = argv[1] | |
| 117 except IndexError as err: | |
| 118 print 'Usage: %s OUTPUT_DIR' % argv[0] | |
| 119 return 1 | |
| 120 lexer = BlinkIDLLexer(outputdir=outputdir) | |
| 121 | |
| 122 | |
| 89 if __name__ == '__main__': | 123 if __name__ == '__main__': |
| 90 lexer = BlinkIDLLexer() | 124 sys.exit(main(sys.argv)) |
| OLD | NEW |