| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import { parseAffixToken } from './affix-tokens.js';
- import { parseNumberToken } from './number-tokens.js';
- function parseSubpattern(src, pos, onError) {
- let State;
- (function (State) {
- State[State["Prefix"] = 0] = "Prefix";
- State[State["Number"] = 1] = "Number";
- State[State["Suffix"] = 2] = "Suffix";
- })(State || (State = {}));
- const prefix = [];
- const number = [];
- const suffix = [];
- let state = State.Prefix;
- let str = '';
- while (pos < src.length) {
- const char = src[pos];
- if (char === ';') {
- pos += 1;
- break;
- }
- switch (state) {
- case State.Prefix: {
- const token = parseAffixToken(src, pos, onError);
- if (token) {
- if (str) {
- prefix.push({ char: "'", str, width: str.length });
- str = '';
- }
- prefix.push(token);
- pos += token.width;
- }
- else {
- const token = parseNumberToken(src, pos);
- if (token) {
- if (str) {
- prefix.push({ char: "'", str, width: str.length });
- str = '';
- }
- state = State.Number;
- number.push(token);
- pos += token.width;
- }
- else {
- str += char;
- pos += 1;
- }
- }
- break;
- }
- case State.Number: {
- const token = parseNumberToken(src, pos);
- if (token) {
- number.push(token);
- pos += token.width;
- }
- else {
- state = State.Suffix;
- }
- break;
- }
- case State.Suffix: {
- const token = parseAffixToken(src, pos, onError);
- if (token) {
- if (str) {
- suffix.push({ char: "'", str, width: str.length });
- str = '';
- }
- suffix.push(token);
- pos += token.width;
- }
- else {
- str += char;
- pos += 1;
- }
- break;
- }
- }
- }
- if (str)
- suffix.push({ char: "'", str, width: str.length });
- return { pattern: { prefix, number, suffix }, pos };
- }
- export function parseTokens(src, onError) {
- const { pattern, pos } = parseSubpattern(src, 0, onError);
- if (pos < src.length) {
- const { pattern: negative } = parseSubpattern(src, pos, onError);
- return { tokens: pattern, negative };
- }
- return { tokens: pattern };
- }
|