OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import imp | 5 import imp |
6 import os.path | 6 import os.path |
7 import sys | 7 import sys |
8 | 8 |
9 def _GetDirAbove(dirname): | 9 def _GetDirAbove(dirname): |
10 """Returns the directory "above" this file containing |dirname| (which must | 10 """Returns the directory "above" this file containing |dirname| (which must |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 ## | 71 ## |
72 ## All the tokens recognized by the lexer | 72 ## All the tokens recognized by the lexer |
73 ## | 73 ## |
74 tokens = keywords + ( | 74 tokens = keywords + ( |
75 # Identifiers | 75 # Identifiers |
76 'NAME', | 76 'NAME', |
77 | 77 |
78 # Constants | 78 # Constants |
79 'ORDINAL', | 79 'ORDINAL', |
80 'INT_CONST_DEC', 'INT_CONST_HEX', | 80 'INT_CONST_DEC', 'INT_CONST_HEX', |
81 'FLOAT_CONST', | 81 'FLOAT_CONST', 'FLOAT_BUILTIN', |
82 | 82 |
83 # String literals | 83 # String literals |
84 'STRING_LITERAL', | 84 'STRING_LITERAL', |
85 | 85 |
86 # Operators | 86 # Operators |
87 'MINUS', | 87 'MINUS', |
88 'PLUS', | 88 'PLUS', |
89 'AMP', | 89 'AMP', |
90 'QSTN', | 90 'QSTN', |
91 | 91 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 string_char = r"""([^"\\\n]|"""+escape_sequence+')' | 139 string_char = r"""([^"\\\n]|"""+escape_sequence+')' |
140 string_literal = '"'+string_char+'*"' | 140 string_literal = '"'+string_char+'*"' |
141 bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"' | 141 bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"' |
142 | 142 |
143 # floating constants (K&R2: A.2.5.3) | 143 # floating constants (K&R2: A.2.5.3) |
144 exponent_part = r"""([eE][-+]?[0-9]+)""" | 144 exponent_part = r"""([eE][-+]?[0-9]+)""" |
145 fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)""" | 145 fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)""" |
146 floating_constant = \ | 146 floating_constant = \ |
147 '(((('+fractional_constant+')'+ \ | 147 '(((('+fractional_constant+')'+ \ |
148 exponent_part+'?)|([0-9]+'+exponent_part+')))' | 148 exponent_part+'?)|([0-9]+'+exponent_part+')))' |
| 149 floating_builtin = \ |
| 150 r"""(((double)|(float))\.((NAN)|((NEGATIVE_)?INFINITY)))""" |
149 | 151 |
150 # Ordinals | 152 # Ordinals |
151 ordinal = r'@[0-9]+' | 153 ordinal = r'@[0-9]+' |
152 missing_ordinal_value = r'@' | 154 missing_ordinal_value = r'@' |
153 # Don't allow ordinal values in octal (even invalid octal, like 09) or | 155 # Don't allow ordinal values in octal (even invalid octal, like 09) or |
154 # hexadecimal. | 156 # hexadecimal. |
155 octal_or_hex_ordinal_disallowed = r'@((0[0-9]+)|('+hex_prefix+hex_digits+'))' | 157 octal_or_hex_ordinal_disallowed = r'@((0[0-9]+)|('+hex_prefix+hex_digits+'))' |
156 | 158 |
157 ## | 159 ## |
158 ## Rules for the normal state | 160 ## Rules for the normal state |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 | 195 |
194 # The following floating and integer constants are defined as | 196 # The following floating and integer constants are defined as |
195 # functions to impose a strict order (otherwise, decimal | 197 # functions to impose a strict order (otherwise, decimal |
196 # is placed before the others because its regex is longer, | 198 # is placed before the others because its regex is longer, |
197 # and this is bad) | 199 # and this is bad) |
198 # | 200 # |
199 @TOKEN(floating_constant) | 201 @TOKEN(floating_constant) |
200 def t_FLOAT_CONST(self, t): | 202 def t_FLOAT_CONST(self, t): |
201 return t | 203 return t |
202 | 204 |
| 205 @TOKEN(floating_builtin) |
| 206 def t_FLOAT_BUILTIN(self, t): |
| 207 return t |
| 208 |
203 @TOKEN(hex_constant) | 209 @TOKEN(hex_constant) |
204 def t_INT_CONST_HEX(self, t): | 210 def t_INT_CONST_HEX(self, t): |
205 return t | 211 return t |
206 | 212 |
207 @TOKEN(octal_constant_disallowed) | 213 @TOKEN(octal_constant_disallowed) |
208 def t_OCTAL_CONSTANT_DISALLOWED(self, t): | 214 def t_OCTAL_CONSTANT_DISALLOWED(self, t): |
209 msg = "Octal values not allowed" | 215 msg = "Octal values not allowed" |
210 self._error(msg, t) | 216 self._error(msg, t) |
211 | 217 |
212 @TOKEN(decimal_constant) | 218 @TOKEN(decimal_constant) |
(...skipping 28 matching lines...) Expand all Loading... |
241 return t | 247 return t |
242 | 248 |
243 # Ignore C and C++ style comments | 249 # Ignore C and C++ style comments |
244 def t_COMMENT(self, t): | 250 def t_COMMENT(self, t): |
245 r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)' | 251 r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)' |
246 t.lexer.lineno += t.value.count("\n") | 252 t.lexer.lineno += t.value.count("\n") |
247 | 253 |
248 def t_error(self, t): | 254 def t_error(self, t): |
249 msg = "Illegal character %s" % repr(t.value[0]) | 255 msg = "Illegal character %s" % repr(t.value[0]) |
250 self._error(msg, t) | 256 self._error(msg, t) |
OLD | NEW |