xy-sql-formatter
Version:
Format whitespace in a SQL query to make it more readable
473 lines (456 loc) • 26.2 kB
text/typescript
// Generated automatically by nearley, version 2.20.1
// http://github.com/Hardmath123/nearley
// Bypasses TS6133. Allow declared but unused functions.
// @ts-ignore
function id(d: any[]): any { return d[0]; }
declare var DELIMITER: any;
declare var EOF: any;
declare var LIMIT: any;
declare var COMMA: any;
declare var RESERVED_SELECT: any;
declare var ASTERISK: any;
declare var RESERVED_CLAUSE: any;
declare var RESERVED_SET_OPERATION: any;
declare var ARRAY_IDENTIFIER: any;
declare var ARRAY_KEYWORD: any;
declare var RESERVED_FUNCTION_NAME: any;
declare var PROPERTY_ACCESS_OPERATOR: any;
declare var BETWEEN: any;
declare var AND: any;
declare var CASE: any;
declare var END: any;
declare var WHEN: any;
declare var THEN: any;
declare var ELSE: any;
declare var OPERATOR: any;
declare var IDENTIFIER: any;
declare var QUOTED_IDENTIFIER: any;
declare var VARIABLE: any;
declare var NAMED_PARAMETER: any;
declare var QUOTED_PARAMETER: any;
declare var NUMBERED_PARAMETER: any;
declare var POSITIONAL_PARAMETER: any;
declare var CUSTOM_PARAMETER: any;
declare var NUMBER: any;
declare var STRING: any;
declare var RESERVED_KEYWORD: any;
declare var RESERVED_PHRASE: any;
declare var RESERVED_JOIN: any;
declare var RESERVED_DATA_TYPE: any;
declare var RESERVED_PARAMETERIZED_DATA_TYPE: any;
declare var OR: any;
declare var XOR: any;
declare var LINE_COMMENT: any;
declare var BLOCK_COMMENT: any;
declare var DISABLE_COMMENT: any;
import LexerAdapter from './LexerAdapter.js';
import { NodeType, AstNode, CommentNode, KeywordNode, IdentifierNode, DataTypeNode } from './ast.js';
import { Token, TokenType } from '../lexer/token.js';
// The lexer here is only to provide the has() method,
// that's used inside the generated grammar definition.
// A proper lexer gets passed to Nearley Parser constructor.
const lexer = new LexerAdapter(chunk => []);
// Used for unwrapping grammar rules like:
//
// rule -> ( foo | bar | baz )
//
// which otherwise produce single element nested inside two arrays
const unwrap = <T>([[el]]: T[][]): T => el;
const toKeywordNode = (token: Token): KeywordNode => ({
type: NodeType.keyword,
tokenType: token.type,
text: token.text,
raw: token.raw,
});
const toDataTypeNode = (token: Token): DataTypeNode => ({
type: NodeType.data_type,
text: token.text,
raw: token.raw,
});
interface CommentAttachments {
leading?: CommentNode[];
trailing?: CommentNode[];
}
const addComments = (node: AstNode, { leading, trailing }: CommentAttachments): AstNode => {
if (leading?.length) {
node = { ...node, leadingComments: leading };
}
if (trailing?.length) {
node = { ...node, trailingComments: trailing };
}
return node;
};
const addCommentsToArray = (nodes: AstNode[], { leading, trailing }: CommentAttachments): AstNode[] => {
if (leading?.length) {
const [first, ...rest] = nodes;
nodes = [addComments(first, { leading }), ...rest];
}
if (trailing?.length) {
const lead = nodes.slice(0, -1);
const last = nodes[nodes.length-1];
nodes = [...lead, addComments(last, { trailing })];
}
return nodes;
};
interface NearleyToken {
value: any;
[key: string]: any;
};
interface NearleyLexer {
reset: (chunk: string, info: any) => void;
next: () => NearleyToken | undefined;
save: () => any;
formatError: (token: never) => string;
has: (tokenType: string) => boolean;
};
interface NearleyRule {
name: string;
symbols: NearleySymbol[];
postprocess?: (d: any[], loc?: number, reject?: {}) => any;
};
type NearleySymbol = string | { literal: any } | { test: (token: any) => boolean };
interface Grammar {
Lexer: NearleyLexer | undefined;
ParserRules: NearleyRule[];
ParserStart: string;
};
const grammar: Grammar = {
Lexer: lexer,
ParserRules: [
{"name": "main$ebnf$1", "symbols": []},
{"name": "main$ebnf$1", "symbols": ["main$ebnf$1", "statement"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "main", "symbols": ["main$ebnf$1"], "postprocess":
([statements]) => {
const last = statements[statements.length - 1];
if (last && !last.hasSemicolon) {
// we have fully parsed the whole file
// discard the last statement when it's empty
return last.children.length > 0 ? statements : statements.slice(0, -1);
} else {
// parsing still in progress, do nothing
return statements;
}
}
},
{"name": "statement$subexpression$1", "symbols": [(lexer.has("DELIMITER") ? {type: "DELIMITER"} : DELIMITER)]},
{"name": "statement$subexpression$1", "symbols": [(lexer.has("EOF") ? {type: "EOF"} : EOF)]},
{"name": "statement", "symbols": ["expressions_or_clauses", "statement$subexpression$1"], "postprocess":
([children, [delimiter]]) => ({
type: NodeType.statement,
children,
hasSemicolon: delimiter.type === TokenType.DELIMITER,
})
},
{"name": "expressions_or_clauses$ebnf$1", "symbols": []},
{"name": "expressions_or_clauses$ebnf$1", "symbols": ["expressions_or_clauses$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "expressions_or_clauses$ebnf$2", "symbols": []},
{"name": "expressions_or_clauses$ebnf$2", "symbols": ["expressions_or_clauses$ebnf$2", "clause"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "expressions_or_clauses", "symbols": ["expressions_or_clauses$ebnf$1", "expressions_or_clauses$ebnf$2"], "postprocess":
([expressions, clauses]) => [...expressions, ...clauses]
},
{"name": "clause$subexpression$1", "symbols": ["limit_clause"]},
{"name": "clause$subexpression$1", "symbols": ["select_clause"]},
{"name": "clause$subexpression$1", "symbols": ["other_clause"]},
{"name": "clause$subexpression$1", "symbols": ["set_operation"]},
{"name": "clause", "symbols": ["clause$subexpression$1"], "postprocess": unwrap},
{"name": "limit_clause$ebnf$1$subexpression$1$ebnf$1", "symbols": ["free_form_sql"]},
{"name": "limit_clause$ebnf$1$subexpression$1$ebnf$1", "symbols": ["limit_clause$ebnf$1$subexpression$1$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "limit_clause$ebnf$1$subexpression$1", "symbols": [(lexer.has("COMMA") ? {type: "COMMA"} : COMMA), "limit_clause$ebnf$1$subexpression$1$ebnf$1"]},
{"name": "limit_clause$ebnf$1", "symbols": ["limit_clause$ebnf$1$subexpression$1"], "postprocess": id},
{"name": "limit_clause$ebnf$1", "symbols": [], "postprocess": () => null},
{"name": "limit_clause", "symbols": [(lexer.has("LIMIT") ? {type: "LIMIT"} : LIMIT), "_", "expression_chain_", "limit_clause$ebnf$1"], "postprocess":
([limitToken, _, exp1, optional]) => {
if (optional) {
const [comma, exp2] = optional;
return {
type: NodeType.limit_clause,
limitKw: addComments(toKeywordNode(limitToken), { trailing: _ }),
offset: exp1,
count: exp2,
};
} else {
return {
type: NodeType.limit_clause,
limitKw: addComments(toKeywordNode(limitToken), { trailing: _ }),
count: exp1,
};
}
}
},
{"name": "select_clause$subexpression$1$ebnf$1", "symbols": []},
{"name": "select_clause$subexpression$1$ebnf$1", "symbols": ["select_clause$subexpression$1$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "select_clause$subexpression$1", "symbols": ["all_columns_asterisk", "select_clause$subexpression$1$ebnf$1"]},
{"name": "select_clause$subexpression$1$ebnf$2", "symbols": []},
{"name": "select_clause$subexpression$1$ebnf$2", "symbols": ["select_clause$subexpression$1$ebnf$2", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "select_clause$subexpression$1", "symbols": ["asteriskless_free_form_sql", "select_clause$subexpression$1$ebnf$2"]},
{"name": "select_clause", "symbols": [(lexer.has("RESERVED_SELECT") ? {type: "RESERVED_SELECT"} : RESERVED_SELECT), "select_clause$subexpression$1"], "postprocess":
([nameToken, [exp, expressions]]) => ({
type: NodeType.clause,
nameKw: toKeywordNode(nameToken),
children: [exp, ...expressions],
})
},
{"name": "select_clause", "symbols": [(lexer.has("RESERVED_SELECT") ? {type: "RESERVED_SELECT"} : RESERVED_SELECT)], "postprocess":
([nameToken]) => ({
type: NodeType.clause,
nameKw: toKeywordNode(nameToken),
children: [],
})
},
{"name": "all_columns_asterisk", "symbols": [(lexer.has("ASTERISK") ? {type: "ASTERISK"} : ASTERISK)], "postprocess":
() => ({ type: NodeType.all_columns_asterisk })
},
{"name": "other_clause$ebnf$1", "symbols": []},
{"name": "other_clause$ebnf$1", "symbols": ["other_clause$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "other_clause", "symbols": [(lexer.has("RESERVED_CLAUSE") ? {type: "RESERVED_CLAUSE"} : RESERVED_CLAUSE), "other_clause$ebnf$1"], "postprocess":
([nameToken, children]) => ({
type: NodeType.clause,
nameKw: toKeywordNode(nameToken),
children,
})
},
{"name": "set_operation$ebnf$1", "symbols": []},
{"name": "set_operation$ebnf$1", "symbols": ["set_operation$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "set_operation", "symbols": [(lexer.has("RESERVED_SET_OPERATION") ? {type: "RESERVED_SET_OPERATION"} : RESERVED_SET_OPERATION), "set_operation$ebnf$1"], "postprocess":
([nameToken, children]) => ({
type: NodeType.set_operation,
nameKw: toKeywordNode(nameToken),
children,
})
},
{"name": "expression_chain_$ebnf$1", "symbols": ["expression_with_comments_"]},
{"name": "expression_chain_$ebnf$1", "symbols": ["expression_chain_$ebnf$1", "expression_with_comments_"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "expression_chain_", "symbols": ["expression_chain_$ebnf$1"], "postprocess": id},
{"name": "expression_chain$ebnf$1", "symbols": []},
{"name": "expression_chain$ebnf$1", "symbols": ["expression_chain$ebnf$1", "_expression_with_comments"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "expression_chain", "symbols": ["expression", "expression_chain$ebnf$1"], "postprocess":
([expr, chain]) => [expr, ...chain]
},
{"name": "andless_expression_chain$ebnf$1", "symbols": []},
{"name": "andless_expression_chain$ebnf$1", "symbols": ["andless_expression_chain$ebnf$1", "_andless_expression_with_comments"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "andless_expression_chain", "symbols": ["andless_expression", "andless_expression_chain$ebnf$1"], "postprocess":
([expr, chain]) => [expr, ...chain]
},
{"name": "expression_with_comments_", "symbols": ["expression", "_"], "postprocess":
([expr, _]) => addComments(expr, { trailing: _ })
},
{"name": "_expression_with_comments", "symbols": ["_", "expression"], "postprocess":
([_, expr]) => addComments(expr, { leading: _ })
},
{"name": "_andless_expression_with_comments", "symbols": ["_", "andless_expression"], "postprocess":
([_, expr]) => addComments(expr, { leading: _ })
},
{"name": "free_form_sql$subexpression$1", "symbols": ["asteriskless_free_form_sql"]},
{"name": "free_form_sql$subexpression$1", "symbols": ["asterisk"]},
{"name": "free_form_sql", "symbols": ["free_form_sql$subexpression$1"], "postprocess": unwrap},
{"name": "asteriskless_free_form_sql$subexpression$1", "symbols": ["asteriskless_andless_expression"]},
{"name": "asteriskless_free_form_sql$subexpression$1", "symbols": ["logic_operator"]},
{"name": "asteriskless_free_form_sql$subexpression$1", "symbols": ["comma"]},
{"name": "asteriskless_free_form_sql$subexpression$1", "symbols": ["comment"]},
{"name": "asteriskless_free_form_sql$subexpression$1", "symbols": ["other_keyword"]},
{"name": "asteriskless_free_form_sql", "symbols": ["asteriskless_free_form_sql$subexpression$1"], "postprocess": unwrap},
{"name": "expression$subexpression$1", "symbols": ["andless_expression"]},
{"name": "expression$subexpression$1", "symbols": ["logic_operator"]},
{"name": "expression", "symbols": ["expression$subexpression$1"], "postprocess": unwrap},
{"name": "andless_expression$subexpression$1", "symbols": ["asteriskless_andless_expression"]},
{"name": "andless_expression$subexpression$1", "symbols": ["asterisk"]},
{"name": "andless_expression", "symbols": ["andless_expression$subexpression$1"], "postprocess": unwrap},
{"name": "asteriskless_andless_expression$subexpression$1", "symbols": ["atomic_expression"]},
{"name": "asteriskless_andless_expression$subexpression$1", "symbols": ["between_predicate"]},
{"name": "asteriskless_andless_expression$subexpression$1", "symbols": ["case_expression"]},
{"name": "asteriskless_andless_expression", "symbols": ["asteriskless_andless_expression$subexpression$1"], "postprocess": unwrap},
{"name": "atomic_expression$subexpression$1", "symbols": ["array_subscript"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["function_call"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["property_access"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["parenthesis"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["curly_braces"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["square_brackets"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["operator"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["identifier"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["parameter"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["literal"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["data_type"]},
{"name": "atomic_expression$subexpression$1", "symbols": ["keyword"]},
{"name": "atomic_expression", "symbols": ["atomic_expression$subexpression$1"], "postprocess": unwrap},
{"name": "array_subscript", "symbols": [(lexer.has("ARRAY_IDENTIFIER") ? {type: "ARRAY_IDENTIFIER"} : ARRAY_IDENTIFIER), "_", "square_brackets"], "postprocess":
([arrayToken, _, brackets]) => ({
type: NodeType.array_subscript,
array: addComments({ type: NodeType.identifier, quoted: false, text: arrayToken.text}, { trailing: _ }),
parenthesis: brackets,
})
},
{"name": "array_subscript", "symbols": [(lexer.has("ARRAY_KEYWORD") ? {type: "ARRAY_KEYWORD"} : ARRAY_KEYWORD), "_", "square_brackets"], "postprocess":
([arrayToken, _, brackets]) => ({
type: NodeType.array_subscript,
array: addComments(toKeywordNode(arrayToken), { trailing: _ }),
parenthesis: brackets,
})
},
{"name": "function_call", "symbols": [(lexer.has("RESERVED_FUNCTION_NAME") ? {type: "RESERVED_FUNCTION_NAME"} : RESERVED_FUNCTION_NAME), "_", "parenthesis"], "postprocess":
([nameToken, _, parens]) => ({
type: NodeType.function_call,
nameKw: addComments(toKeywordNode(nameToken), { trailing: _ }),
parenthesis: parens,
})
},
{"name": "parenthesis", "symbols": [{"literal":"("}, "expressions_or_clauses", {"literal":")"}], "postprocess":
([open, children, close]) => ({
type: NodeType.parenthesis,
children: children,
openParen: "(",
closeParen: ")",
})
},
{"name": "curly_braces$ebnf$1", "symbols": []},
{"name": "curly_braces$ebnf$1", "symbols": ["curly_braces$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "curly_braces", "symbols": [{"literal":"{"}, "curly_braces$ebnf$1", {"literal":"}"}], "postprocess":
([open, children, close]) => ({
type: NodeType.parenthesis,
children: children,
openParen: "{",
closeParen: "}",
})
},
{"name": "square_brackets$ebnf$1", "symbols": []},
{"name": "square_brackets$ebnf$1", "symbols": ["square_brackets$ebnf$1", "free_form_sql"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "square_brackets", "symbols": [{"literal":"["}, "square_brackets$ebnf$1", {"literal":"]"}], "postprocess":
([open, children, close]) => ({
type: NodeType.parenthesis,
children: children,
openParen: "[",
closeParen: "]",
})
},
{"name": "property_access$subexpression$1", "symbols": ["identifier"]},
{"name": "property_access$subexpression$1", "symbols": ["array_subscript"]},
{"name": "property_access$subexpression$1", "symbols": ["all_columns_asterisk"]},
{"name": "property_access$subexpression$1", "symbols": ["parameter"]},
{"name": "property_access", "symbols": ["atomic_expression", "_", (lexer.has("PROPERTY_ACCESS_OPERATOR") ? {type: "PROPERTY_ACCESS_OPERATOR"} : PROPERTY_ACCESS_OPERATOR), "_", "property_access$subexpression$1"], "postprocess":
// Allowing property to be <array_subscript> is currently a hack.
// A better way would be to allow <property_access> on the left side of array_subscript,
// but we currently can't do that because of another hack that requires
// %ARRAY_IDENTIFIER on the left side of <array_subscript>.
([object, _1, dot, _2, [property]]) => {
return {
type: NodeType.property_access,
object: addComments(object, { trailing: _1 }),
operator: dot.text,
property: addComments(property, { leading: _2 }),
};
}
},
{"name": "between_predicate", "symbols": [(lexer.has("BETWEEN") ? {type: "BETWEEN"} : BETWEEN), "_", "andless_expression_chain", "_", (lexer.has("AND") ? {type: "AND"} : AND), "_", "andless_expression"], "postprocess":
([betweenToken, _1, expr1, _2, andToken, _3, expr2]) => ({
type: NodeType.between_predicate,
betweenKw: toKeywordNode(betweenToken),
expr1: addCommentsToArray(expr1, { leading: _1, trailing: _2 }),
andKw: toKeywordNode(andToken),
expr2: [addComments(expr2, { leading: _3 })],
})
},
{"name": "case_expression$ebnf$1", "symbols": ["expression_chain_"], "postprocess": id},
{"name": "case_expression$ebnf$1", "symbols": [], "postprocess": () => null},
{"name": "case_expression$ebnf$2", "symbols": []},
{"name": "case_expression$ebnf$2", "symbols": ["case_expression$ebnf$2", "case_clause"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "case_expression", "symbols": [(lexer.has("CASE") ? {type: "CASE"} : CASE), "_", "case_expression$ebnf$1", "case_expression$ebnf$2", (lexer.has("END") ? {type: "END"} : END)], "postprocess":
([caseToken, _, expr, clauses, endToken]) => ({
type: NodeType.case_expression,
caseKw: addComments(toKeywordNode(caseToken), { trailing: _ }),
endKw: toKeywordNode(endToken),
expr: expr || [],
clauses,
})
},
{"name": "case_clause", "symbols": [(lexer.has("WHEN") ? {type: "WHEN"} : WHEN), "_", "expression_chain_", (lexer.has("THEN") ? {type: "THEN"} : THEN), "_", "expression_chain_"], "postprocess":
([whenToken, _1, cond, thenToken, _2, expr]) => ({
type: NodeType.case_when,
whenKw: addComments(toKeywordNode(whenToken), { trailing: _1 }),
thenKw: addComments(toKeywordNode(thenToken), { trailing: _2 }),
condition: cond,
result: expr,
})
},
{"name": "case_clause", "symbols": [(lexer.has("ELSE") ? {type: "ELSE"} : ELSE), "_", "expression_chain_"], "postprocess":
([elseToken, _, expr]) => ({
type: NodeType.case_else,
elseKw: addComments(toKeywordNode(elseToken), { trailing: _ }),
result: expr,
})
},
{"name": "comma$subexpression$1", "symbols": [(lexer.has("COMMA") ? {type: "COMMA"} : COMMA)]},
{"name": "comma", "symbols": ["comma$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.comma })},
{"name": "asterisk$subexpression$1", "symbols": [(lexer.has("ASTERISK") ? {type: "ASTERISK"} : ASTERISK)]},
{"name": "asterisk", "symbols": ["asterisk$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.operator, text: token.text })},
{"name": "operator$subexpression$1", "symbols": [(lexer.has("OPERATOR") ? {type: "OPERATOR"} : OPERATOR)]},
{"name": "operator", "symbols": ["operator$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.operator, text: token.text })},
{"name": "identifier$subexpression$1", "symbols": [(lexer.has("IDENTIFIER") ? {type: "IDENTIFIER"} : IDENTIFIER)]},
{"name": "identifier$subexpression$1", "symbols": [(lexer.has("QUOTED_IDENTIFIER") ? {type: "QUOTED_IDENTIFIER"} : QUOTED_IDENTIFIER)]},
{"name": "identifier$subexpression$1", "symbols": [(lexer.has("VARIABLE") ? {type: "VARIABLE"} : VARIABLE)]},
{"name": "identifier", "symbols": ["identifier$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.identifier, quoted: token.type !== "IDENTIFIER", text: token.text })},
{"name": "parameter$subexpression$1", "symbols": [(lexer.has("NAMED_PARAMETER") ? {type: "NAMED_PARAMETER"} : NAMED_PARAMETER)]},
{"name": "parameter$subexpression$1", "symbols": [(lexer.has("QUOTED_PARAMETER") ? {type: "QUOTED_PARAMETER"} : QUOTED_PARAMETER)]},
{"name": "parameter$subexpression$1", "symbols": [(lexer.has("NUMBERED_PARAMETER") ? {type: "NUMBERED_PARAMETER"} : NUMBERED_PARAMETER)]},
{"name": "parameter$subexpression$1", "symbols": [(lexer.has("POSITIONAL_PARAMETER") ? {type: "POSITIONAL_PARAMETER"} : POSITIONAL_PARAMETER)]},
{"name": "parameter$subexpression$1", "symbols": [(lexer.has("CUSTOM_PARAMETER") ? {type: "CUSTOM_PARAMETER"} : CUSTOM_PARAMETER)]},
{"name": "parameter", "symbols": ["parameter$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.parameter, key: token.key, text: token.text })},
{"name": "literal$subexpression$1", "symbols": [(lexer.has("NUMBER") ? {type: "NUMBER"} : NUMBER)]},
{"name": "literal$subexpression$1", "symbols": [(lexer.has("STRING") ? {type: "STRING"} : STRING)]},
{"name": "literal", "symbols": ["literal$subexpression$1"], "postprocess": ([[token]]) => ({ type: NodeType.literal, text: token.text })},
{"name": "keyword$subexpression$1", "symbols": [(lexer.has("RESERVED_KEYWORD") ? {type: "RESERVED_KEYWORD"} : RESERVED_KEYWORD)]},
{"name": "keyword$subexpression$1", "symbols": [(lexer.has("RESERVED_PHRASE") ? {type: "RESERVED_PHRASE"} : RESERVED_PHRASE)]},
{"name": "keyword$subexpression$1", "symbols": [(lexer.has("RESERVED_JOIN") ? {type: "RESERVED_JOIN"} : RESERVED_JOIN)]},
{"name": "keyword", "symbols": ["keyword$subexpression$1"], "postprocess":
([[token]]) => toKeywordNode(token)
},
{"name": "data_type$subexpression$1", "symbols": [(lexer.has("RESERVED_DATA_TYPE") ? {type: "RESERVED_DATA_TYPE"} : RESERVED_DATA_TYPE)]},
{"name": "data_type", "symbols": ["data_type$subexpression$1"], "postprocess":
([[token]]) => toDataTypeNode(token)
},
{"name": "data_type", "symbols": [(lexer.has("RESERVED_PARAMETERIZED_DATA_TYPE") ? {type: "RESERVED_PARAMETERIZED_DATA_TYPE"} : RESERVED_PARAMETERIZED_DATA_TYPE), "_", "parenthesis"], "postprocess":
([nameToken, _, parens]) => ({
type: NodeType.parameterized_data_type,
dataType: addComments(toDataTypeNode(nameToken), { trailing: _ }),
parenthesis: parens,
})
},
{"name": "logic_operator$subexpression$1", "symbols": [(lexer.has("AND") ? {type: "AND"} : AND)]},
{"name": "logic_operator$subexpression$1", "symbols": [(lexer.has("OR") ? {type: "OR"} : OR)]},
{"name": "logic_operator$subexpression$1", "symbols": [(lexer.has("XOR") ? {type: "XOR"} : XOR)]},
{"name": "logic_operator", "symbols": ["logic_operator$subexpression$1"], "postprocess":
([[token]]) => toKeywordNode(token)
},
{"name": "other_keyword$subexpression$1", "symbols": [(lexer.has("WHEN") ? {type: "WHEN"} : WHEN)]},
{"name": "other_keyword$subexpression$1", "symbols": [(lexer.has("THEN") ? {type: "THEN"} : THEN)]},
{"name": "other_keyword$subexpression$1", "symbols": [(lexer.has("ELSE") ? {type: "ELSE"} : ELSE)]},
{"name": "other_keyword$subexpression$1", "symbols": [(lexer.has("END") ? {type: "END"} : END)]},
{"name": "other_keyword", "symbols": ["other_keyword$subexpression$1"], "postprocess":
([[token]]) => toKeywordNode(token)
},
{"name": "_$ebnf$1", "symbols": []},
{"name": "_$ebnf$1", "symbols": ["_$ebnf$1", "comment"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "_", "symbols": ["_$ebnf$1"], "postprocess": ([comments]) => comments},
{"name": "comment", "symbols": [(lexer.has("LINE_COMMENT") ? {type: "LINE_COMMENT"} : LINE_COMMENT)], "postprocess":
([token]) => ({
type: NodeType.line_comment,
text: token.text,
precedingWhitespace: token.precedingWhitespace,
})
},
{"name": "comment", "symbols": [(lexer.has("BLOCK_COMMENT") ? {type: "BLOCK_COMMENT"} : BLOCK_COMMENT)], "postprocess":
([token]) => ({
type: NodeType.block_comment,
text: token.text,
precedingWhitespace: token.precedingWhitespace,
})
},
{"name": "comment", "symbols": [(lexer.has("DISABLE_COMMENT") ? {type: "DISABLE_COMMENT"} : DISABLE_COMMENT)], "postprocess":
([token]) => ({
type: NodeType.disable_comment,
text: token.text,
precedingWhitespace: token.precedingWhitespace,
})
}
],
ParserStart: "main",
};
export default grammar;