UNPKG

hyperformula

Version:

HyperFormula is a JavaScript engine for efficient processing of spreadsheet-like data and formulas

202 lines (200 loc) 7.93 kB
"use strict"; exports.__esModule = true; exports.buildLexerConfig = exports.TimesOp = exports.StringLiteral = exports.RowRange = exports.RangeSeparator = exports.RParen = exports.ProcedureName = exports.PowerOp = exports.PlusOp = exports.PercentOp = exports.NotEqualOp = exports.NamedExpression = exports.MultiplicationOp = exports.MinusOp = exports.LessThanOrEqualOp = exports.LessThanOp = exports.LParen = exports.GreaterThanOrEqualOp = exports.GreaterThanOp = exports.ErrorLiteral = exports.EqualsOp = exports.DivOp = exports.ConcatenateOp = exports.ColumnRange = exports.CellReference = exports.BooleanOp = exports.ArrayRParen = exports.ArrayLParen = exports.AdditionOp = void 0; var _chevrotain = require("chevrotain"); var _parserConsts = require("./parser-consts"); var _CellReferenceMatcher = require("./CellReferenceMatcher"); var _NamedExpressionMatcher = require("./NamedExpressionMatcher"); /** * @license * Copyright (c) 2025 Handsoncode. All rights reserved. */ const AdditionOp = exports.AdditionOp = (0, _chevrotain.createToken)({ name: 'AdditionOp', pattern: _chevrotain.Lexer.NA }); const PlusOp = exports.PlusOp = (0, _chevrotain.createToken)({ name: 'PlusOp', pattern: /\+/, categories: AdditionOp }); const MinusOp = exports.MinusOp = (0, _chevrotain.createToken)({ name: 'MinusOp', pattern: /-/, categories: AdditionOp }); const MultiplicationOp = exports.MultiplicationOp = (0, _chevrotain.createToken)({ name: 'MultiplicationOp', pattern: _chevrotain.Lexer.NA }); const TimesOp = exports.TimesOp = (0, _chevrotain.createToken)({ name: 'TimesOp', pattern: /\*/, categories: MultiplicationOp }); const DivOp = exports.DivOp = (0, _chevrotain.createToken)({ name: 'DivOp', pattern: /\//, categories: MultiplicationOp }); const PowerOp = exports.PowerOp = (0, _chevrotain.createToken)({ name: 'PowerOp', pattern: /\^/ }); const PercentOp = exports.PercentOp = (0, _chevrotain.createToken)({ name: 'PercentOp', pattern: /%/ }); const BooleanOp = exports.BooleanOp = (0, _chevrotain.createToken)({ name: 'BooleanOp', pattern: _chevrotain.Lexer.NA }); const EqualsOp = exports.EqualsOp = (0, _chevrotain.createToken)({ name: 'EqualsOp', pattern: /=/, categories: BooleanOp }); const NotEqualOp = exports.NotEqualOp = (0, _chevrotain.createToken)({ name: 'NotEqualOp', pattern: /<>/, categories: BooleanOp }); const GreaterThanOp = exports.GreaterThanOp = (0, _chevrotain.createToken)({ name: 'GreaterThanOp', pattern: />/, categories: BooleanOp }); const LessThanOp = exports.LessThanOp = (0, _chevrotain.createToken)({ name: 'LessThanOp', pattern: /</, categories: BooleanOp }); const GreaterThanOrEqualOp = exports.GreaterThanOrEqualOp = (0, _chevrotain.createToken)({ name: 'GreaterThanOrEqualOp', pattern: />=/, categories: BooleanOp }); const LessThanOrEqualOp = exports.LessThanOrEqualOp = (0, _chevrotain.createToken)({ name: 'LessThanOrEqualOp', pattern: /<=/, categories: BooleanOp }); const ConcatenateOp = exports.ConcatenateOp = (0, _chevrotain.createToken)({ name: 'ConcatenateOp', pattern: /&/ }); const LParen = exports.LParen = (0, _chevrotain.createToken)({ name: 'LParen', pattern: /\(/ }); const RParen = exports.RParen = (0, _chevrotain.createToken)({ name: 'RParen', pattern: /\)/ }); const ArrayLParen = exports.ArrayLParen = (0, _chevrotain.createToken)({ name: 'ArrayLParen', pattern: /{/ }); const ArrayRParen = exports.ArrayRParen = (0, _chevrotain.createToken)({ name: 'ArrayRParen', pattern: /}/ }); const StringLiteral = exports.StringLiteral = (0, _chevrotain.createToken)({ name: 'StringLiteral', pattern: /"([^"\\]*(\\.[^"\\]*)*)"/ }); const ErrorLiteral = exports.ErrorLiteral = (0, _chevrotain.createToken)({ name: 'ErrorLiteral', pattern: /#[A-Za-z0-9\/]+[?!]?/ }); const RangeSeparator = exports.RangeSeparator = (0, _chevrotain.createToken)({ name: 'RangeSeparator', pattern: new RegExp(_parserConsts.RANGE_OPERATOR) }); const ColumnRange = exports.ColumnRange = (0, _chevrotain.createToken)({ name: 'ColumnRange', pattern: new RegExp(`${_parserConsts.COLUMN_REFERENCE_PATTERN}${_parserConsts.RANGE_OPERATOR}${_parserConsts.COLUMN_REFERENCE_PATTERN}`) }); const RowRange = exports.RowRange = (0, _chevrotain.createToken)({ name: 'RowRange', pattern: new RegExp(`${_parserConsts.ROW_REFERENCE_PATTERN}${_parserConsts.RANGE_OPERATOR}${_parserConsts.ROW_REFERENCE_PATTERN}`) }); const ProcedureName = exports.ProcedureName = (0, _chevrotain.createToken)({ name: 'ProcedureName', pattern: new RegExp(`([${_parserConsts.UNICODE_LETTER_PATTERN}][${_parserConsts.NON_RESERVED_CHARACTER_PATTERN}]*)\\(`) }); const cellReferenceMatcher = new _CellReferenceMatcher.CellReferenceMatcher(); const CellReference = exports.CellReference = (0, _chevrotain.createToken)({ name: 'CellReference', pattern: cellReferenceMatcher.match.bind(cellReferenceMatcher), start_chars_hint: cellReferenceMatcher.POSSIBLE_START_CHARACTERS, line_breaks: false }); const namedExpressionMatcher = new _NamedExpressionMatcher.NamedExpressionMatcher(); const NamedExpression = exports.NamedExpression = (0, _chevrotain.createToken)({ name: 'NamedExpression', pattern: namedExpressionMatcher.match.bind(namedExpressionMatcher), start_chars_hint: namedExpressionMatcher.POSSIBLE_START_CHARACTERS, line_breaks: false }); /** * Builds the configuration object for the lexer */ const buildLexerConfig = config => { const offsetProcedureNameLiteral = config.translationPackage.getFunctionTranslation('OFFSET'); const errorMapping = config.errorMapping; const functionMapping = config.translationPackage.buildFunctionMapping(); const whitespaceTokenRegexp = new RegExp(config.ignoreWhiteSpace === 'standard' ? _parserConsts.ODFF_WHITESPACE_PATTERN : _parserConsts.ALL_WHITESPACE_PATTERN); const WhiteSpace = (0, _chevrotain.createToken)({ name: 'WhiteSpace', pattern: whitespaceTokenRegexp }); const ArrayRowSeparator = (0, _chevrotain.createToken)({ name: 'ArrayRowSep', pattern: config.arrayRowSeparator }); const ArrayColSeparator = (0, _chevrotain.createToken)({ name: 'ArrayColSep', pattern: config.arrayColumnSeparator }); const NumberLiteral = (0, _chevrotain.createToken)({ name: 'NumberLiteral', pattern: new RegExp(`(([${config.decimalSeparator}]\\d+)|(\\d+([${config.decimalSeparator}]\\d*)?))(e[+-]?\\d+)?`) }); const OffsetProcedureName = (0, _chevrotain.createToken)({ name: 'OffsetProcedureName', pattern: new RegExp(offsetProcedureNameLiteral, 'i') }); let ArgSeparator; let inject; if (config.functionArgSeparator === config.arrayColumnSeparator) { ArgSeparator = ArrayColSeparator; inject = []; } else if (config.functionArgSeparator === config.arrayRowSeparator) { ArgSeparator = ArrayRowSeparator; inject = []; } else { ArgSeparator = (0, _chevrotain.createToken)({ name: 'ArgSeparator', pattern: config.functionArgSeparator }); inject = [ArgSeparator]; } /* order is important, first pattern is used */ const allTokens = [WhiteSpace, PlusOp, MinusOp, TimesOp, DivOp, PowerOp, EqualsOp, NotEqualOp, PercentOp, GreaterThanOrEqualOp, LessThanOrEqualOp, GreaterThanOp, LessThanOp, LParen, RParen, ArrayLParen, ArrayRParen, OffsetProcedureName, ProcedureName, RangeSeparator, ...inject, ColumnRange, RowRange, NumberLiteral, StringLiteral, ErrorLiteral, ConcatenateOp, BooleanOp, AdditionOp, MultiplicationOp, CellReference, NamedExpression, ArrayRowSeparator, ArrayColSeparator]; return { ArgSeparator, NumberLiteral, OffsetProcedureName, ArrayRowSeparator, ArrayColSeparator, WhiteSpace, allTokens, errorMapping, functionMapping, decimalSeparator: config.decimalSeparator, maxColumns: config.maxColumns, maxRows: config.maxRows }; }; exports.buildLexerConfig = buildLexerConfig;