(rules)
| 15290 | exports.RegexTokeniser = RegexTokeniser; |
| 15291 | |
| 15292 | function RegexTokeniser(rules) { |
| 15293 | rules = rules.map(function(rule) { |
| 15294 | return { |
| 15295 | name: rule.name, |
| 15296 | regex: new RegExp(rule.regex.source, "g") |
| 15297 | }; |
| 15298 | }); |
| 15299 | |
| 15300 | function tokenise(input, description) { |
| 15301 | var source = new StringSource(input, description); |
| 15302 | var index = 0; |
| 15303 | var tokens = []; |
| 15304 | |
| 15305 | while (index < input.length) { |
| 15306 | var result = readNextToken(input, index, source); |
| 15307 | index = result.endIndex; |
| 15308 | tokens.push(result.token); |
| 15309 | } |
| 15310 | |
| 15311 | tokens.push(endToken(input, source)); |
| 15312 | return tokens; |
| 15313 | } |
| 15314 | |
| 15315 | function readNextToken(string, startIndex, source) { |
| 15316 | for (var i = 0; i < rules.length; i++) { |
| 15317 | var regex = rules[i].regex; |
| 15318 | regex.lastIndex = startIndex; |
| 15319 | var result = regex.exec(string); |
| 15320 | |
| 15321 | if (result) { |
| 15322 | var endIndex = startIndex + result[0].length; |
| 15323 | if (result.index === startIndex && endIndex > startIndex) { |
| 15324 | var value = result[1]; |
| 15325 | var token = new Token( |
| 15326 | rules[i].name, |
| 15327 | value, |
| 15328 | source.range(startIndex, endIndex) |
| 15329 | ); |
| 15330 | return {token: token, endIndex: endIndex}; |
| 15331 | } |
| 15332 | } |
| 15333 | } |
| 15334 | var endIndex = startIndex + 1; |
| 15335 | var token = new Token( |
| 15336 | "unrecognisedCharacter", |
| 15337 | string.substring(startIndex, endIndex), |
| 15338 | source.range(startIndex, endIndex) |
| 15339 | ); |
| 15340 | return {token: token, endIndex: endIndex}; |
| 15341 | } |
| 15342 | |
| 15343 | function endToken(input, source) { |
| 15344 | return new Token( |
| 15345 | "end", |
| 15346 | null, |
| 15347 | source.range(input.length, input.length) |
| 15348 | ); |
| 15349 | } |
nothing calls this directly
no outgoing calls
no test coverage detected