| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'package:path/path.dart' as p; | 5 import 'package:path/path.dart' as p; |
| 6 import 'package:string_scanner/string_scanner.dart'; | 6 import 'package:string_scanner/string_scanner.dart'; |
| 7 | 7 |
| 8 import 'ast.dart'; | 8 import 'ast.dart'; |
| 9 import 'utils.dart'; | 9 import 'utils.dart'; |
| 10 | 10 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 continue; | 113 continue; |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Allow a backslash to escape a character. | 116 // Allow a backslash to escape a character. |
| 117 _scanner.scan('\\'); | 117 _scanner.scan('\\'); |
| 118 | 118 |
| 119 var end = readRangeChar(); | 119 var end = readRangeChar(); |
| 120 | 120 |
| 121 if (end < char) { | 121 if (end < char) { |
| 122 _scanner.error("Range out of order.", | 122 _scanner.error("Range out of order.", |
| 123 position: start, | 123 position: start, length: _scanner.position - start); |
| 124 length: _scanner.position - start); | |
| 125 } | 124 } |
| 126 ranges.add(new Range(char, end)); | 125 ranges.add(new Range(char, end)); |
| 127 } else { | 126 } else { |
| 128 ranges.add(new Range.singleton(char)); | 127 ranges.add(new Range.singleton(char)); |
| 129 } | 128 } |
| 130 } | 129 } |
| 131 | 130 |
| 132 return new RangeNode(ranges, | 131 return new RangeNode(ranges, |
| 133 negated: negated, caseSensitive: _caseSensitive); | 132 negated: negated, caseSensitive: _caseSensitive); |
| 134 } | 133 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 149 if (options.length == 1) _scanner.expect(','); | 148 if (options.length == 1) _scanner.expect(','); |
| 150 _scanner.expect('}'); | 149 _scanner.expect('}'); |
| 151 | 150 |
| 152 return new OptionsNode(options, caseSensitive: _caseSensitive); | 151 return new OptionsNode(options, caseSensitive: _caseSensitive); |
| 153 } | 152 } |
| 154 | 153 |
| 155 /// Parses a [LiteralNode]. | 154 /// Parses a [LiteralNode]. |
| 156 AstNode _parseLiteral({bool inOptions: false}) { | 155 AstNode _parseLiteral({bool inOptions: false}) { |
| 157 // If we're in an options block, we want to stop parsing as soon as we hit a | 156 // If we're in an options block, we want to stop parsing as soon as we hit a |
| 158 // comma. Otherwise, commas are fair game for literals. | 157 // comma. Otherwise, commas are fair game for literals. |
| 159 var regExp = new RegExp( | 158 var regExp = |
| 160 inOptions ? r'[^*{[?\\}\],()]*' : r'[^*{[?\\}\]()]*'); | 159 new RegExp(inOptions ? r'[^*{[?\\}\],()]*' : r'[^*{[?\\}\]()]*'); |
| 161 | 160 |
| 162 _scanner.scan(regExp); | 161 _scanner.scan(regExp); |
| 163 var buffer = new StringBuffer()..write(_scanner.lastMatch[0]); | 162 var buffer = new StringBuffer()..write(_scanner.lastMatch[0]); |
| 164 | 163 |
| 165 while (_scanner.scan('\\')) { | 164 while (_scanner.scan('\\')) { |
| 166 buffer.writeCharCode(_scanner.readChar()); | 165 buffer.writeCharCode(_scanner.readChar()); |
| 167 _scanner.scan(regExp); | 166 _scanner.scan(regExp); |
| 168 buffer.write(_scanner.lastMatch[0]); | 167 buffer.write(_scanner.lastMatch[0]); |
| 169 } | 168 } |
| 170 | 169 |
| 171 for (var char in const [']', '(', ')']) { | 170 for (var char in const [']', '(', ')']) { |
| 172 if (_scanner.matches(char)) _scanner.error('unexpected "$char"'); | 171 if (_scanner.matches(char)) _scanner.error('unexpected "$char"'); |
| 173 } | 172 } |
| 174 if (!inOptions && _scanner.matches('}')) _scanner.error('unexpected "}"'); | 173 if (!inOptions && _scanner.matches('}')) _scanner.error('unexpected "}"'); |
| 175 | 174 |
| 176 return new LiteralNode(buffer.toString(), | 175 return new LiteralNode(buffer.toString(), |
| 177 context: _context, caseSensitive: _caseSensitive); | 176 context: _context, caseSensitive: _caseSensitive); |
| 178 } | 177 } |
| 179 } | 178 } |
| OLD | NEW |