jora
Version:
JavaScript object query engine
81 lines (71 loc) • 3.38 kB
JavaScript
import {
TOKEN_$, TOKEN_AND, TOKEN_OR, TOKEN_NOT, TOKEN_NO, TOKEN_IS, TOKEN_IN, TOKEN_NOTIN,
TOKEN_HAS, TOKEN_HASNO, TOKEN_ORDER, TOKEN_METHOD_OPEN, TOKEN_$METHOD_OPEN,
TOKEN_TPL_CONTINUE, TOKEN_TPL_END, TOKEN_DOT, TOKEN_DOT_DOT, TOKEN_DOT_OPEN_PAREN,
TOKEN_DOT_OPEN_BRACKET, TOKEN_DOT_DOT_OPEN_PAREN, TOKEN_PIPE, TOKEN_ARROW, TOKEN_EQUALS,
TOKEN_NOT_EQUALS, TOKEN_MATCH, TOKEN_LESS_THAN, TOKEN_LESS_THAN_EQUALS, TOKEN_GREATER_THAN,
TOKEN_GREATER_THAN_EQUALS, TOKEN_PLUS, TOKEN_MINUS, TOKEN_MULTIPLY, TOKEN_DIVIDE,
TOKEN_MODULO, TOKEN_QUESTION, TOKEN_OPEN_PAREN, TOKEN_CLOSE_PAREN, TOKEN_OPEN_BRACKET,
TOKEN_CLOSE_BRACKET, TOKEN_CLOSE_BRACE, TOKEN_COMMA, TOKEN_COLON, TOKEN_SEMICOLON, TOKEN_EOF,
createTokenSet
} from './tokens.js';
// Optimized tolerant token pairs with shared sets for better memory usage
const keywords = [TOKEN_AND, TOKEN_OR, TOKEN_IN, TOKEN_NOTIN, TOKEN_HAS, TOKEN_HASNO, TOKEN_IS];
const operators = [
TOKEN_PLUS, TOKEN_MINUS, TOKEN_MULTIPLY, TOKEN_DIVIDE, TOKEN_MODULO, TOKEN_PIPE,
TOKEN_EQUALS, TOKEN_NOT_EQUALS, TOKEN_MATCH,
TOKEN_GREATER_THAN_EQUALS, TOKEN_LESS_THAN_EQUALS, TOKEN_LESS_THAN, TOKEN_GREATER_THAN
];
const baseTokens = [
TOKEN_COMMA, TOKEN_QUESTION, TOKEN_COLON, TOKEN_SEMICOLON, TOKEN_EOF,
TOKEN_CLOSE_BRACKET, TOKEN_CLOSE_PAREN, TOKEN_CLOSE_BRACE,
TOKEN_TPL_CONTINUE, TOKEN_TPL_END, TOKEN_ORDER,
...operators,
...keywords
];
// Shared set of tokens that can follow a missing identifier
const commonNextTokens = createTokenSet(...baseTokens);
// Specialized sets for tokens that need exclusions
const emptyBlockNextTokens = createTokenSet(...baseTokens);
emptyBlockNextTokens[TOKEN_CLOSE_PAREN] = 0;
const emptyBracketNextTokens = createTokenSet(...baseTokens);
emptyBracketNextTokens[TOKEN_CLOSE_BRACKET] = 0;
const dollarNextTokens = createTokenSet(
TOKEN_COMMA, TOKEN_QUESTION, TOKEN_COLON,
TOKEN_TPL_CONTINUE, TOKEN_TPL_END, TOKEN_ORDER,
...operators,
...keywords
);
// Exclude operators and keywords that work directly with $
[
TOKEN_PIPE, TOKEN_EQUALS, TOKEN_PLUS, TOKEN_MINUS,
TOKEN_MULTIPLY, TOKEN_DIVIDE, TOKEN_MODULO,
TOKEN_IN, TOKEN_HAS, TOKEN_NOTIN, TOKEN_HASNO
].forEach(token => dollarNextTokens[token] = 0);
// Create the lookup map with optimized shared sets
export const TOLERANT_TOKEN_PAIRS = new Map([
// Tokens that can precede missing identifiers
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
// Tokens with exclusions for empty constructs
[],
[],
[],
[],
[],
[],
// Special handling for $ token
[],
// Operators and keywords
...operators.map(op => [op, commonNextTokens]),
...keywords.map(kw => [kw, commonNextTokens])
]);