funcity 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/scripting.ts","../src/tokenizer.ts","../src/parser.ts","../src/reducer.ts","../src/standards.ts"],"sourcesContent":["// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\n//////////////////////////////////////////////////////////////////////////////\n\nexport interface MtrScriptLocation {\n readonly line: number;\n readonly column: number;\n}\n\nexport interface MtrScriptRange {\n readonly start: MtrScriptLocation;\n readonly end: MtrScriptLocation;\n}\n\nexport const emptyLocation: MtrScriptLocation = {\n line: 0,\n column: 0,\n} as const;\n\nexport const emptyRange: MtrScriptRange = {\n start: emptyLocation,\n end: emptyLocation,\n} as const;\n\nexport type MtrScriptErrorType = 'warning' | 'error';\n\nexport interface MtrScriptErrorInfo {\n readonly type: MtrScriptErrorType;\n readonly description: string;\n readonly range: MtrScriptRange;\n}\n\nexport type MtrScriptVariables = ReadonlyMap<string, unknown>;\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst specialFunctionMarker: unique symbol = Symbol('$$special$$');\n\nexport const makeSpecialFunction = (f: Function) => {\n (f as any)[specialFunctionMarker] = true;\n return f;\n};\n\nexport const isSpecialFunction = (f: Function): boolean => {\n return (f as any)[specialFunctionMarker] ?? false;\n};\n\nexport const isConditionalTrue = (v: unknown) => {\n if (v === undefined || v === null) {\n return false;\n }\n switch (typeof v) {\n case 'boolean':\n return v;\n case 'number':\n case 'bigint':\n return v !== 0;\n default:\n return true;\n }\n};\n\nexport const asIterable = (v: unknown): Iterable<unknown> | undefined => {\n if (typeof (v as any)[Symbol.iterator] === 'function') {\n return v as Iterable<unknown>;\n } else {\n return undefined;\n }\n};\n\nexport const combineVariables = (\n ...variablesList: readonly (MtrScriptVariables | Record<string, unknown>)[]\n): MtrScriptVariables => {\n const variables = new Map<string, unknown>();\n\n const appendVariables = (vs: MtrScriptVariables) =>\n vs.forEach((v, k) => variables.set(k, v));\n const appendRecord = (vs: Record<string, unknown>) =>\n Object.keys(vs).forEach((k) => variables.set(k, vs[k]));\n\n variablesList.forEach((vs) => {\n if (vs['forEach'] !== undefined) {\n // ReadonlyMap.forEach\n appendVariables(vs as MtrScriptVariables);\n } else {\n appendRecord(vs as Record<string, unknown>);\n }\n });\n\n return variables;\n};\n\nexport const fromError = (error: any): string => {\n if (error.message) {\n return error.message;\n } else if (typeof error.toString === 'function') {\n return error.toString() ?? 'unknown';\n } else {\n return 'unknown';\n }\n};\n\nexport const widerRange = (...ranges: MtrScriptRange[]): MtrScriptRange => {\n let start = emptyRange.start;\n let end = emptyRange.end;\n\n for (const range of ranges) {\n if (range.start.line >= 1 && range.start.column >= 1) {\n if (start.line === 0 || start.column === 0) {\n start = range.start;\n } else if (range.start.line < start.line) {\n start = range.start;\n } else if (\n range.start.line === start.line &&\n range.start.column < start.column\n ) {\n start = range.start;\n }\n\n if (end.line === 0 || end.column === 0) {\n end = range.end;\n } else if (range.end.line > end.line) {\n end = range.end;\n } else if (range.end.line === end.line && range.end.column > end.column) {\n end = range.end;\n }\n }\n }\n\n return { start, end };\n};\n\nconst locationEquals = (lhs: MtrScriptLocation, rhs: MtrScriptLocation) =>\n lhs.line === rhs.line && lhs.column === rhs.column;\n\nconst getLocationString = (range: MtrScriptRange) =>\n locationEquals(range.start, range.end)\n ? `${range.start.line}:${range.start.column}`\n : `${range.start.line}:${range.start.column}:${range.end.line}:${range.end.column}`;\n\nconst printErrorString = (path: string, error: MtrScriptErrorInfo) => {\n switch (error.type) {\n case 'warning':\n console.warn(\n `${path}:${getLocationString(error.range)}: warning: ${error.description}`\n );\n break;\n case 'error':\n console.error(\n `${path}:${getLocationString(error.range)}: error: ${error.description}`\n );\n return true;\n }\n return false;\n};\n\nexport const outputErrors = (\n path: string,\n errors: readonly MtrScriptErrorInfo[]\n) => {\n let isError = false;\n for (const error of errors) {\n const result = printErrorString(path, error);\n isError ||= result;\n }\n return isError;\n};\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport type {\n MtrScriptErrorInfo,\n MtrScriptLocation,\n MtrScriptRange,\n} from './scripting';\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * The string token.\n */\nexport interface MtrScriptStringToken {\n readonly kind: 'string';\n /**\n * String value.\n */\n readonly value: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * The number (numeric) token.\n */\nexport interface MtrScriptNumberToken {\n readonly kind: 'number';\n /**\n * Numeric value.\n */\n readonly value: number;\n readonly range: MtrScriptRange;\n}\n\n/**\n * The identity (variable name) token.\n */\nexport interface MtrScriptIdentityToken {\n readonly kind: 'identity';\n /**\n * Identity.\n */\n readonly name: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Open parenthesis or bracket node.\n */\nexport interface MtrScriptOpenToken {\n readonly kind: 'open';\n /**\n * Open symbol.\n */\n readonly symbol: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Close parenthesis or bracket token.\n */\nexport interface MtrScriptCloseToken {\n readonly kind: 'close';\n /**\n * Close symbol.\n */\n readonly symbol: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * End of line token.\n */\nexport interface MtrScriptEndOfLineToken {\n readonly kind: 'eol';\n readonly range: MtrScriptRange;\n}\n\n/**\n * Free form text token.\n */\nexport interface MtrScriptTextToken {\n readonly kind: 'text';\n /**\n * Text value.\n */\n readonly text: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * The token.\n */\nexport type MtrScriptToken =\n | MtrScriptStringToken\n | MtrScriptNumberToken\n | MtrScriptIdentityToken\n | MtrScriptOpenToken\n | MtrScriptCloseToken\n | MtrScriptEndOfLineToken\n | MtrScriptTextToken;\n\n//////////////////////////////////////////////////////////////////////////////\n\ntype LocationTypes = 'start' | 'end';\n\n/**\n * Text cursor interface.\n */\ninterface TokenizerCursor {\n /**\n * Is cursor reached end of text?\n * @return True when reached end of text.\n */\n eot: () => boolean;\n /**\n * Get one char.\n * @param index - Relative index of current cursor range (default: 0)\n * @returns A char of range.\n */\n getChar: (index?: number) => string;\n /**\n * Simply skip current range.\n * @param length - Skip with this length.\n */\n skip: (length: number) => void;\n /**\n * Skip while the char.\n * @param ch - Skip char.\n * @returns False when reached end of text.\n */\n skipChars: (ch: string) => boolean;\n /**\n * Skip until the word.\n * @param word - Skip when detecting the word.\n * @returns False when reached end of text.\n */\n skipUntil: (word: string) => boolean;\n /**\n * Asserts the text.\n * @param word - The text.\n * @returns True when the text detected.\n */\n assert: (word: string) => boolean;\n /**\n * Get text and skip.\n * @param length - Text length.\n * @returns Text.\n */\n getRangeAndSkip: (length: number) => string;\n /**\n * Get text until the word.\n * @param word - Get text when detecting the word.\n * @returns Text or undefined when current cursor is already reached end of text.\n */\n getUntil: (word: string) => string | undefined;\n /**\n * Get current location object.\n * @param type - Location type.\n * @returns Location object.\n */\n location: (type: LocationTypes) => MtrScriptLocation;\n}\n\n/**\n * Tokenizer context.\n */\ninterface TokenizerContext {\n /**\n * Current tokenizer cursor.\n */\n readonly cursor: TokenizerCursor;\n /**\n * Will be stored detected warnings/errors into it\n */\n readonly errors: MtrScriptErrorInfo[];\n}\n\n/**\n * Tokenize the string value.\n * @param context Tokenizer context\n * @returns String token\n */\nconst tokenizeString = (context: TokenizerContext): MtrScriptStringToken => {\n const start = context.cursor.location('start');\n\n // Skip open quote\n context.cursor.skip(1);\n\n // Find close quote\n let value = context.cursor.getUntil(\"'\");\n if (value !== undefined) {\n context.cursor.skip(1); // Skip close quote\n } else {\n const location = context.cursor.location('start');\n context.errors.push({\n type: 'error',\n description: 'string close quote is not found',\n range: { start: location, end: location },\n });\n value = '';\n }\n\n return {\n kind: 'string',\n value,\n range: { start, end: context.cursor.location('end') },\n };\n};\n\nconst firstNumericChars = '0123456789-+';\nconst numericCharsWithDot = '0123456789.';\nconst numericChars = '0123456789';\n\n/**\n * Tokenize the number (numeric) value.\n * @param context Tokenizer context\n * @returns Number token\n */\nconst tokenizeNumber = (context: TokenizerContext): MtrScriptNumberToken => {\n const start = context.cursor.location('start');\n\n let index = 1;\n while (true) {\n if (context.cursor.eot()) {\n return {\n kind: 'number',\n value: Number(context.cursor.getRangeAndSkip(index)),\n range: { start, end: context.cursor.location('end') },\n };\n }\n\n const ch = context.cursor.getChar(index);\n if (numericCharsWithDot.indexOf(ch) < 0) {\n if (ch === '.') {\n break;\n }\n return {\n kind: 'number',\n value: Number(context.cursor.getRangeAndSkip(index)),\n range: { start, end: context.cursor.location('end') },\n };\n }\n index++;\n }\n\n while (true) {\n if (context.cursor.eot()) {\n return {\n kind: 'number',\n value: Number(context.cursor.getRangeAndSkip(index)),\n range: { start, end: context.cursor.location('end') },\n };\n }\n\n const ch = context.cursor.getChar(index);\n if (numericChars.indexOf(ch) < 0) {\n return {\n kind: 'number',\n value: Number(context.cursor.getRangeAndSkip(index)),\n range: { start, end: context.cursor.location('end') },\n };\n }\n index++;\n }\n};\n\nconst firstVariableChars =\n '_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nconst variableChars =\n '_-.?0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/**\n * Tokenize the identity (variable name).\n * @param context Tokenizer context\n * @returns Identity token\n */\nconst tokenizeIdentity = (\n context: TokenizerContext\n): MtrScriptIdentityToken => {\n const start = context.cursor.location('start');\n\n let index = 1;\n let lastCh = '';\n while (true) {\n if (context.cursor.eot()) {\n break;\n }\n\n const ch = context.cursor.getChar(index);\n if (variableChars.indexOf(ch) < 0) {\n break;\n }\n if (lastCh === '?') {\n index--;\n break;\n }\n\n lastCh = ch;\n index++;\n }\n\n return {\n kind: 'identity',\n name: context.cursor.getRangeAndSkip(index),\n range: { start, end: context.cursor.location('end') },\n };\n};\n\n/**\n * Tokenize code block.\n * @param context Tokenizer context\n * @returns The token list\n */\nconst tokenizeCodeBlock = (context: TokenizerContext): MtrScriptToken[] => {\n const openStart = context.cursor.location('start');\n\n // Skip open brackets '{{'\n context.cursor.skip(2);\n\n const tokens: MtrScriptToken[] = [\n {\n kind: 'open',\n symbol: '{{',\n range: { start: openStart, end: context.cursor.location('end') },\n },\n ];\n\n let unknownStartLocation: MtrScriptLocation | undefined;\n const finalizeUnknown = () => {\n if (unknownStartLocation) {\n context.errors.push({\n type: 'warning',\n description: 'unknown words',\n range: {\n start: unknownStartLocation,\n end: context.cursor.location('end'),\n },\n });\n unknownStartLocation = undefined;\n }\n };\n\n while (!context.cursor.eot()) {\n // Assert close brackets\n if (context.cursor.assert('}}')) {\n finalizeUnknown();\n const location = context.cursor.location('start');\n context.cursor.skip(2);\n tokens.push({\n kind: 'close',\n symbol: '}}',\n range: { start: location, end: context.cursor.location('end') },\n });\n return tokens;\n }\n\n const ch = context.cursor.getChar();\n if (ch === '\\\\') {\n const next = context.cursor.getChar(1);\n if (next === '{' || next === '}') {\n context.cursor.skip(2);\n continue;\n }\n }\n\n // Read string\n if (ch === \"'\") {\n finalizeUnknown();\n tokens.push(tokenizeString(context));\n }\n // Read number\n else if (firstNumericChars.indexOf(ch) >= 0) {\n finalizeUnknown();\n tokens.push(tokenizeNumber(context));\n }\n // Read open parentesis\n else if (ch === '(') {\n finalizeUnknown();\n const location = context.cursor.location('start');\n tokens.push({\n kind: 'open',\n symbol: '(',\n range: { start: location, end: location },\n });\n context.cursor.skip(1);\n }\n // Read close parentesis\n else if (ch === ')') {\n finalizeUnknown();\n const location = context.cursor.location('start');\n tokens.push({\n kind: 'close',\n symbol: ')',\n range: { start: location, end: location },\n });\n context.cursor.skip(1);\n }\n // Read open bracket\n else if (ch === '[') {\n finalizeUnknown();\n const location = context.cursor.location('start');\n tokens.push({\n kind: 'open',\n symbol: '[',\n range: { start: location, end: location },\n });\n context.cursor.skip(1);\n }\n // Read close bracket\n else if (ch === ']') {\n finalizeUnknown();\n const location = context.cursor.location('start');\n tokens.push({\n kind: 'close',\n symbol: ']',\n range: { start: location, end: location },\n });\n context.cursor.skip(1);\n }\n // Read identity\n else if (firstVariableChars.indexOf(ch) >= 0) {\n finalizeUnknown();\n tokens.push(tokenizeIdentity(context));\n }\n // End of line\n else if (ch === '\\n') {\n finalizeUnknown();\n const location = context.cursor.location('start');\n tokens.push({\n kind: 'eol',\n range: { start: location, end: location },\n });\n context.cursor.skip(1);\n }\n // Ignored CR\n else if (ch === '\\r') {\n finalizeUnknown();\n context.cursor.skip(1);\n }\n // Ignored space\n else if (ch === ' ') {\n finalizeUnknown();\n context.cursor.skip(1);\n }\n // Unknown\n else if (!unknownStartLocation) {\n unknownStartLocation = context.cursor.location('start');\n context.cursor.skip(1);\n }\n\n // Skip spaces\n context.cursor.skipChars(' ');\n }\n\n const causeLocation = context.cursor.location('start');\n context.errors.push({\n type: 'error',\n description: 'required code block closer: `}}`',\n range: { start: causeLocation, end: causeLocation },\n });\n return tokens;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a tonenizer cursor object.\n * @param text - A text.\n * @returns Tonenizer cursor object.\n */\nconst createTokenizerCursor = (text: string): TokenizerCursor => {\n let currentIndex = 0;\n let rawLine = 0;\n let rawColumn = 0;\n let lastLine = 0;\n let lastColumn = 0;\n\n const eot = () => currentIndex >= text.length;\n const getChar = (index?: number) => text[(index ?? 0) + currentIndex]!;\n const skip = (length: number) => {\n let lastch = '\\0';\n while (length > 0) {\n lastColumn = rawColumn;\n lastLine = rawLine;\n const ch = text[currentIndex]!;\n if (ch === '\\r') {\n rawColumn = 0;\n } else if (ch === '\\n' && lastch !== '\\r') {\n rawColumn = 0;\n rawLine++;\n } else {\n rawColumn++;\n }\n currentIndex++;\n length--;\n lastch = ch;\n }\n };\n const skipChars = (ch: string) => {\n while (!eot()) {\n if (getChar() !== ch) {\n return true;\n }\n skip(1);\n }\n return false;\n };\n const skipUntil = (word: string) => {\n while (!eot()) {\n const index = text.indexOf(word, currentIndex);\n if (index === currentIndex) {\n skip(word.length);\n return true;\n }\n skip(1);\n }\n return false;\n };\n const assert = (word: string) => {\n if (text.length - currentIndex < word.length) {\n return false;\n }\n if (text.substring(currentIndex, currentIndex + word.length) === word) {\n return true;\n }\n return false;\n };\n const getRangeAndSkip = (length: number) => {\n const result = text.substring(currentIndex, currentIndex + length);\n skip(result.length);\n return result;\n };\n const getUntil = (word: string) => {\n if (currentIndex >= text.length) {\n return undefined;\n }\n const index = text.indexOf(word, currentIndex);\n if (index >= 0) {\n const result = text.substring(currentIndex, index);\n skip(index - currentIndex);\n return result;\n } else {\n const result = text.substring(currentIndex, text.length);\n skip(text.length - currentIndex);\n return result;\n }\n };\n const location = (type: LocationTypes): MtrScriptLocation =>\n type === 'end'\n ? {\n line: lastLine + 1,\n column: lastColumn + 1,\n }\n : {\n line: rawLine + 1,\n column: rawColumn + 1,\n };\n\n return {\n eot,\n getChar,\n skip,\n skipChars,\n skipUntil,\n assert,\n getRangeAndSkip,\n getUntil,\n location,\n };\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * Run tokenizer.\n * @param script - Input script text\n * @errors - Will be stored detected warnings/errors into it\n * @returns The token list\n */\nexport const runTokenizer = (\n script: string,\n errors: MtrScriptErrorInfo[]\n): MtrScriptToken[] => {\n const context: TokenizerContext = {\n cursor: createTokenizerCursor(script),\n errors,\n };\n\n const tokens: MtrScriptToken[] = [];\n\n const readTextBlock = () => {\n if (context.cursor.eot()) {\n return undefined;\n }\n let text = '';\n while (!context.cursor.eot()) {\n if (context.cursor.assert('{{')) {\n return text;\n }\n const ch = context.cursor.getChar();\n if (ch === '\\\\') {\n const next = context.cursor.getChar(1);\n if (next === '{' || next === '}') {\n text += next;\n context.cursor.skip(2);\n continue;\n }\n }\n text += ch;\n context.cursor.skip(1);\n }\n return text;\n };\n\n while (!context.cursor.eot()) {\n const start = context.cursor.location('start');\n\n // Fetch text block (before open code block)\n const text = readTextBlock();\n if (text) {\n tokens.push({\n kind: 'text',\n text,\n range: { start, end: context.cursor.location('end') },\n });\n } else {\n tokens.push(...tokenizeCodeBlock(context));\n }\n }\n\n return tokens;\n};\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport {\n emptyRange,\n widerRange,\n type MtrScriptErrorInfo,\n type MtrScriptRange,\n} from './scripting';\nimport type {\n MtrScriptNumberToken,\n MtrScriptStringToken,\n MtrScriptToken,\n MtrScriptIdentityToken,\n} from './tokenizer';\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * String expression node.\n */\nexport interface MtrScriptStringNode {\n readonly kind: 'string';\n /**\n * String value.\n */\n readonly value: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Number (numeric) expression node.\n */\nexport interface MtrScriptNumberNode {\n readonly kind: 'number';\n /**\n * Numeric value.\n */\n readonly value: number;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Variable (identity) expression node.\n */\nexport interface MtrScriptVariableNode {\n readonly kind: 'variable';\n /**\n * Variable name.\n */\n readonly name: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Application expression node.\n */\nexport interface MtrScriptApplyNode {\n readonly kind: 'apply';\n /**\n * Application target node.\n */\n readonly func: MtrScriptExpressionNode;\n /**\n * Application arguments.\n */\n readonly args: readonly MtrScriptExpressionNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * Lambda expression node.\n */\nexport interface MtrScriptLambdaNode {\n readonly kind: 'lambda';\n /**\n * Parameter names.\n */\n readonly names: readonly MtrScriptVariableNode[];\n /**\n * Lambda body expression.\n */\n readonly body: MtrScriptExpressionNode;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Expression list (array) node.\n */\nexport interface MtrScriptListNode {\n readonly kind: 'list';\n /**\n * List item nodes.\n */\n readonly items: readonly MtrScriptExpressionNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * Variable setter node.\n */\nexport interface MtrScriptSetNode {\n readonly kind: 'set';\n /**\n * Target variable name.\n */\n readonly name: MtrScriptVariableNode;\n /**\n * Will be set the value from reduced expression.\n */\n readonly expr: MtrScriptExpressionNode;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Evaluate child scope node.\n */\nexport interface MtrScriptScopeNode {\n readonly kind: 'scope';\n /**\n * Scoped node list.\n * @remarks Reduced each nodes, but takes last one reduced value.\n */\n readonly nodes: readonly MtrScriptExpressionNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * The expression node.\n */\nexport type MtrScriptExpressionNode =\n | MtrScriptNumberNode\n | MtrScriptStringNode\n | MtrScriptVariableNode\n | MtrScriptApplyNode\n | MtrScriptLambdaNode\n | MtrScriptListNode\n | MtrScriptSetNode\n | MtrScriptScopeNode;\n\n/**\n * Text block node.\n */\nexport interface MtrScriptTextNode {\n readonly kind: 'text';\n /**\n * Text body.\n */\n readonly text: string;\n readonly range: MtrScriptRange;\n}\n\n/**\n * Conditional branch (`if`) block node contains else block.\n */\nexport interface MtrScriptIfNode {\n readonly kind: 'if';\n /**\n * Condition expression node.\n */\n readonly condition: MtrScriptExpressionNode;\n /**\n * Then (true) block node.\n */\n readonly then: readonly MtrScriptBlockNode[];\n /**\n * Else (false) block node.\n */\n readonly else: readonly MtrScriptBlockNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * Conditional repeats (`while`) block node contains else block.\n */\nexport interface MtrScriptWhileNode {\n readonly kind: 'while';\n /**\n * Condition expression node.\n */\n readonly condition: MtrScriptExpressionNode;\n /**\n * Repeat block node.\n */\n readonly repeat: readonly MtrScriptBlockNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * Item iteration (`for`) block node contains else block.\n */\nexport interface MtrScriptForNode {\n readonly kind: 'for';\n /**\n * Bind variable node in each iteration.\n */\n readonly bind: MtrScriptVariableNode;\n /**\n * Iteration target expression node.\n */\n readonly iterable: MtrScriptExpressionNode;\n /**\n * Repeat block node.\n */\n readonly repeat: readonly MtrScriptBlockNode[];\n readonly range: MtrScriptRange;\n}\n\n/**\n * The block node.\n */\nexport type MtrScriptBlockNode =\n | MtrScriptExpressionNode\n | MtrScriptTextNode\n | MtrScriptIfNode\n | MtrScriptWhileNode\n | MtrScriptForNode;\n\n//////////////////////////////////////////////////////////////////////////////\n\ninterface ParserCursor {\n /**\n * Peek one token.\n * @returns A token or undefined when reached end of token.\n */\n peekToken: () => MtrScriptToken | undefined;\n /**\n * Get one token and advance.\n * @returns A token or undefined when reached end of token.\n */\n takeToken: () => MtrScriptToken | undefined;\n}\n\nconst parseNumber = (\n cursor: ParserCursor,\n _errors: MtrScriptErrorInfo[]\n): MtrScriptNumberNode => {\n const token = cursor.takeToken() as MtrScriptNumberToken;\n return {\n kind: 'number',\n value: token.value,\n range: token.range,\n };\n};\n\nconst parseString = (\n cursor: ParserCursor,\n _errors: MtrScriptErrorInfo[]\n): MtrScriptStringNode => {\n const token = cursor.takeToken() as MtrScriptStringToken;\n return {\n kind: 'string',\n value: token.value,\n range: token.range,\n };\n};\n\nconst parseIdentity = (\n cursor: ParserCursor,\n _errors: MtrScriptErrorInfo[]\n): MtrScriptVariableNode => {\n const token = cursor.takeToken() as MtrScriptIdentityToken;\n return {\n kind: 'variable',\n name: token.name,\n range: token.range,\n };\n};\n\nconst unitKind = \"'()'\";\ninterface PartialUnitExpressionNode {\n kind: \"'()'\";\n range: MtrScriptRange;\n}\n\ntype PartialParsedExpressionNode =\n | MtrScriptExpressionNode\n | PartialUnitExpressionNode;\n\nconst combineIntoScopeMultipleExpressions = (\n expressionList: readonly MtrScriptExpressionNode[],\n ...outerRanges: MtrScriptRange[]\n): MtrScriptExpressionNode | undefined => {\n switch (expressionList.length) {\n case 0: {\n return undefined;\n }\n case 1: {\n return expressionList[0]!;\n }\n default: {\n return {\n kind: 'scope',\n nodes: expressionList,\n range: widerRange(\n ...expressionList.map((node) => node.range),\n ...outerRanges\n ),\n };\n }\n }\n};\n\nconst parseLambdaExpression = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptLambdaNode | undefined => {\n const funToken = cursor.takeToken() as MtrScriptIdentityToken;\n const namesPartial = parsePartialExpression(cursor, errors);\n const bodyPartial = namesPartial\n ? parsePartialExpression(cursor, errors)\n : undefined;\n if (!namesPartial || !bodyPartial) {\n const ranges = [funToken.range];\n if (namesPartial) {\n ranges.push(namesPartial.range);\n }\n if (bodyPartial) {\n ranges.push(bodyPartial.range);\n }\n errors.push({\n type: 'error',\n description: 'Required `fun` parameter identity and expression',\n range: widerRange(...ranges),\n });\n return undefined;\n }\n\n const namesNode = normalizePartialUnitNode(namesPartial, errors);\n if (namesNode.kind !== 'variable' && namesNode.kind !== 'list') {\n errors.push({\n type: 'error',\n description: 'Required `fun` parameter identity',\n range: namesNode.range,\n });\n return undefined;\n }\n const nameNodes = extractParameterArguments(namesNode, errors);\n if (!nameNodes) {\n return undefined;\n }\n\n const bodyNode = normalizePartialUnitNode(bodyPartial, errors);\n return {\n kind: 'lambda',\n names: nameNodes,\n body: bodyNode,\n range: widerRange(funToken.range, namesNode.range, bodyNode.range),\n };\n};\n\nconst parsePartialExpression = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): PartialParsedExpressionNode | undefined => {\n const token = cursor.peekToken()!;\n switch (token.kind) {\n case 'number': {\n const node = parseNumber(cursor, errors);\n return node;\n }\n case 'string': {\n const node = parseString(cursor, errors);\n return node;\n }\n case 'identity': {\n if (token.name === 'fun') {\n const node = parseLambdaExpression(cursor, errors);\n return node;\n }\n const node = parseIdentity(cursor, errors);\n return node;\n }\n case 'open': {\n cursor.takeToken();\n switch (token.symbol) {\n // Parenthesis surrounding expression list `( ... )` (Scope)\n case '(': {\n const innerNodes = parseMultipleApplicationExpressions(\n cursor,\n errors\n );\n const closeToken = cursor.peekToken();\n let range: MtrScriptRange;\n if (!closeToken) {\n range = widerRange(\n token.range,\n ...innerNodes.map((node) => node.range)\n );\n errors.push({\n type: 'error',\n description: 'Could not find close parenthesis',\n range: widerRange(\n token.range,\n ...innerNodes.map((node) => node.range)\n ),\n });\n } else {\n cursor.takeToken();\n range = widerRange(\n token.range,\n ...innerNodes.map((node) => node.range),\n closeToken.range\n );\n if (closeToken.kind !== 'close' || closeToken.symbol !== ')') {\n errors.push({\n type: 'error',\n description: `Mismatched close parenthesis`,\n range,\n });\n }\n }\n // Specialized unit node '()' is made by empty nodes\n if (innerNodes.length === 0) {\n return {\n kind: unitKind,\n range,\n };\n } else {\n // When multiple expressions exist, they must be grouped into a single expression within a scope.\n const node = combineIntoScopeMultipleExpressions(innerNodes, range);\n return node;\n }\n }\n // Bracket surrounding expression list `[ ... ]` (Iterable list)\n case '[': {\n const itemNodes = parseListExpression(cursor, errors);\n const closeToken = cursor.peekToken();\n let range: MtrScriptRange;\n if (!closeToken) {\n range = widerRange(\n token.range,\n ...itemNodes.map((node) => node.range)\n );\n errors.push({\n type: 'error',\n description: 'Could not find close bracket',\n range,\n });\n } else {\n cursor.takeToken();\n range = widerRange(\n token.range,\n ...itemNodes.map((node) => node.range),\n closeToken.range\n );\n if (closeToken.kind !== 'close' || closeToken.symbol !== ']') {\n errors.push({\n type: 'error',\n description: `Mismatched close bracket`,\n range,\n });\n }\n }\n return {\n kind: 'list',\n items: itemNodes,\n range,\n };\n }\n default: {\n errors.push({\n type: 'error',\n description: `Invalid open parenthesis/bracket`,\n range: token.range,\n });\n return undefined;\n }\n }\n }\n }\n return undefined;\n};\n\nconst normalizePartialUnitNode = (\n node: PartialParsedExpressionNode,\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode => {\n if (node.kind === unitKind) {\n errors.push({\n type: 'error',\n description: `Invalid ${unitKind} at this location`,\n range: node.range,\n });\n return {\n kind: 'variable',\n name: 'undefined',\n range: node.range,\n };\n } else {\n return node;\n }\n};\n\nconst finalizeApplicationException = (\n partialNodes: readonly PartialParsedExpressionNode[],\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode | undefined => {\n // Empty inputs\n if (partialNodes.length === 0) {\n return;\n }\n // Single variable\n if (partialNodes.length === 1) {\n return normalizePartialUnitNode(partialNodes[0]!, errors);\n }\n // Application\n const func = partialNodes[0]!;\n if (func.kind !== 'variable' && func.kind !== 'lambda') {\n errors.push({\n type: 'error',\n description: `Invalid ${func.kind} at this location`,\n range: func.range,\n });\n return undefined;\n }\n const arg0 = partialNodes[1]!;\n if (arg0.kind === unitKind) {\n return {\n kind: 'apply',\n func,\n args: [], // Unit application: `foobar ()`\n range: widerRange(func.range, arg0.range),\n };\n }\n const args = partialNodes\n .slice(1)\n .map((node) => normalizePartialUnitNode(node, errors));\n return {\n kind: 'apply',\n func: func,\n args,\n range: widerRange(func.range, ...args.map((node) => node.range)),\n };\n};\n\nconst parseMultipleApplicationExpressions = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode[] => {\n const expressionList: MtrScriptExpressionNode[] = [];\n const partialNodes: PartialParsedExpressionNode[] = [];\n\n while (true) {\n const token = cursor.peekToken();\n if (!token) {\n break;\n }\n switch (token.kind) {\n case 'eol': {\n cursor.takeToken();\n const expr = finalizeApplicationException(partialNodes, errors);\n if (expr) {\n expressionList.push(expr);\n }\n partialNodes.length = 0;\n continue;\n }\n }\n const partialNode = parsePartialExpression(cursor, errors);\n if (!partialNode) {\n break;\n }\n partialNodes.push(partialNode);\n }\n\n const expr = finalizeApplicationException(partialNodes, errors);\n if (expr) {\n expressionList.push(expr);\n }\n return expressionList;\n};\n\nconst parseListExpression = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode[] => {\n const itemNodes: MtrScriptExpressionNode[] = [];\n\n while (true) {\n const token = cursor.peekToken();\n if (!token) {\n break;\n }\n\n switch (token.kind) {\n case 'eol': {\n // Ignore in the list\n continue;\n }\n }\n\n const partialNode = parsePartialExpression(cursor, errors);\n if (!partialNode) {\n break;\n }\n\n itemNodes.push(normalizePartialUnitNode(partialNode, errors));\n }\n\n return itemNodes;\n};\n\nconst drainEndOfLineAndPeek = (\n cursor: ParserCursor\n): MtrScriptToken | undefined => {\n let token = cursor.peekToken();\n while (token) {\n if (token.kind === 'eol') {\n cursor.takeToken();\n } else {\n break;\n }\n token = cursor.peekToken();\n }\n return token;\n};\n\n/**\n * Parse expression in the signle line.\n * @param cursor Parser cursor\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Parsed expression node when available\n */\nexport const parseExpression = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode | undefined => {\n // Ignored when reached end of line or end of cursor.\n let token = drainEndOfLineAndPeek(cursor);\n if (!token) {\n return undefined;\n }\n\n // Parse (might be an application) an expression.\n const partialNodes: PartialParsedExpressionNode[] = [];\n\n while (true) {\n // Parse current cursor location.\n const partialNode = parsePartialExpression(cursor, errors);\n if (!partialNode) {\n // Exit when failed (finished stacking nodes)\n break;\n }\n partialNodes.push(partialNode);\n\n // Peek next token.\n token = cursor.peekToken();\n\n // Reached end of cursor.\n if (!token) {\n break;\n }\n\n // Reached end of line.\n if (token.kind === 'eol') {\n cursor.takeToken();\n token = cursor.peekToken();\n break;\n }\n }\n\n // Consume trailing garbage eol\n drainEndOfLineAndPeek(cursor);\n\n // Finalize nodes into apply expression when available multiple expressions.\n const expr = finalizeApplicationException(partialNodes, errors);\n return expr;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\ninterface BranchState {\n blocks: MtrScriptBlockNode[];\n exprBuffer: MtrScriptExpressionNode[];\n}\n\nconst createBranchState = (): BranchState => ({\n blocks: [],\n exprBuffer: [],\n});\n\ninterface RootStatementState {\n readonly kind: 'root';\n readonly startRange: MtrScriptRange;\n readonly branch: BranchState;\n}\n\ninterface IfStatementState {\n readonly kind: 'if';\n readonly startRange: MtrScriptRange;\n readonly condition: MtrScriptExpressionNode;\n readonly then: BranchState;\n readonly else: BranchState;\n currentBlock: 'then' | 'else';\n}\n\ninterface WhileStatementState {\n readonly kind: 'while';\n readonly startRange: MtrScriptRange;\n readonly condition: MtrScriptExpressionNode;\n readonly repeat: BranchState;\n}\n\ninterface ForStatementState {\n readonly kind: 'for';\n readonly startRange: MtrScriptRange;\n readonly bind: MtrScriptVariableNode;\n readonly iterable: MtrScriptExpressionNode;\n readonly repeat: BranchState;\n}\n\ntype LogicalStatementState =\n | RootStatementState\n | IfStatementState\n | WhileStatementState\n | ForStatementState;\n\nconst getBranchState = (statementState: LogicalStatementState): BranchState => {\n switch (statementState.kind) {\n case 'root': {\n return statementState.branch;\n }\n case 'if': {\n return statementState.currentBlock === 'then'\n ? statementState.then\n : statementState.else;\n }\n case 'while':\n case 'for': {\n return statementState.repeat;\n }\n }\n};\n\nconst flushExpressions = (branch: BranchState) => {\n if (branch.exprBuffer.length === 0) {\n return;\n }\n if (branch.exprBuffer.length === 1) {\n branch.blocks.push(branch.exprBuffer[0]!);\n } else {\n branch.blocks.push({\n kind: 'scope',\n nodes: branch.exprBuffer,\n range: widerRange(...branch.exprBuffer.map((node) => node.range)),\n });\n }\n branch.exprBuffer = [];\n};\n\nconst flushCurrentBranch = (statementStates: LogicalStatementState[]) => {\n const statementState = statementStates[statementStates.length - 1]!;\n flushExpressions(getBranchState(statementState));\n};\n\nconst flushStatementState = (statementState: LogicalStatementState) => {\n switch (statementState.kind) {\n case 'root': {\n flushExpressions(statementState.branch);\n break;\n }\n case 'if': {\n flushExpressions(statementState.then);\n flushExpressions(statementState.else);\n break;\n }\n case 'while':\n case 'for': {\n flushExpressions(statementState.repeat);\n break;\n }\n }\n};\n\nconst pushExpressionNode = (\n statementStates: LogicalStatementState[],\n node: MtrScriptExpressionNode\n) => {\n const statementState = statementStates[statementStates.length - 1]!;\n const branch = getBranchState(statementState);\n branch.exprBuffer.push(node);\n};\n\nconst pushBlockNode = (\n statementStates: LogicalStatementState[],\n node: MtrScriptBlockNode\n) => {\n const statementState = statementStates[statementStates.length - 1]!;\n const branch = getBranchState(statementState);\n flushExpressions(branch);\n branch.blocks.push(node);\n};\n\nconst pushNode = (\n statementStates: LogicalStatementState[],\n node: MtrScriptBlockNode\n) => {\n switch (node.kind) {\n case 'text':\n case 'if':\n case 'while':\n case 'for': {\n pushBlockNode(statementStates, node);\n break;\n }\n default: {\n pushExpressionNode(statementStates, node);\n break;\n }\n }\n};\n\nconst parseStatementArguments = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptExpressionNode[] => {\n const args: MtrScriptExpressionNode[] = [];\n\n while (true) {\n const token = cursor.peekToken();\n if (!token) {\n break;\n }\n\n if (token.kind === 'eol') {\n cursor.takeToken();\n break;\n }\n\n const partialNode = parsePartialExpression(cursor, errors);\n if (!partialNode) {\n break;\n }\n\n args.push(normalizePartialUnitNode(partialNode, errors));\n }\n\n return args;\n};\n\nconst extractParameterArguments = (\n namesNode: MtrScriptExpressionNode,\n errors: MtrScriptErrorInfo[]\n): MtrScriptVariableNode[] | undefined => {\n switch (namesNode.kind) {\n case 'variable': {\n return [namesNode];\n }\n case 'list': {\n const nameNodes: MtrScriptVariableNode[] = [];\n for (const nameNode of namesNode.items) {\n if (nameNode.kind !== 'variable') {\n errors.push({\n type: 'error',\n description: 'Required lambda parameter identity',\n range: nameNode.range,\n });\n } else {\n nameNodes.push(nameNode);\n }\n }\n return nameNodes;\n }\n default: {\n errors.push({\n type: 'error',\n description: 'Required lambda parameter identity',\n range: namesNode.range,\n });\n return undefined;\n }\n }\n};\n\n/**\n * Parse blocks.\n * @param cursor Parser cursor\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Parsed expression node when available\n */\nexport const parseBlock = (\n cursor: ParserCursor,\n errors: MtrScriptErrorInfo[]\n): MtrScriptBlockNode[] => {\n // Logical statement state is started at 'root' state.\n // All block node will be aggregated into it.\n const rootState: RootStatementState = {\n kind: 'root',\n startRange: emptyRange,\n branch: createBranchState(),\n };\n const statementStates: LogicalStatementState[] = [rootState];\n let isInExpressionBlock = false;\n\n while (true) {\n const token = drainEndOfLineAndPeek(cursor);\n if (!token) {\n break;\n }\n\n switch (token.kind) {\n case 'text': {\n cursor.takeToken();\n if (isInExpressionBlock) {\n errors.push({\n type: 'error',\n description: `Already opened expression block (tokenizer bug?)`,\n range: token.range,\n });\n break;\n }\n pushNode(statementStates, {\n kind: 'text',\n text: token.text,\n range: token.range,\n });\n break;\n }\n case 'open': {\n // Beginnig expression block.\n if (token.symbol === '{{') {\n cursor.takeToken();\n if (isInExpressionBlock) {\n errors.push({\n type: 'error',\n description: `Already opened expression block`,\n range: token.range,\n });\n }\n isInExpressionBlock = true;\n } else {\n const node = parseExpression(cursor, errors);\n if (node) {\n pushNode(statementStates, node);\n }\n }\n break;\n }\n case 'close': {\n // Check closing.\n cursor.takeToken();\n if (!isInExpressionBlock) {\n errors.push({\n type: 'error',\n description: `Mismatched close bracket`,\n range: token.range,\n });\n break;\n }\n flushCurrentBranch(statementStates);\n isInExpressionBlock = false;\n break;\n }\n case 'identity': {\n if (!isInExpressionBlock) {\n errors.push({\n type: 'error',\n description: `Invalid identity (tokenizer bug?)`,\n range: token.range,\n });\n break;\n }\n switch (token.name) {\n case 'if': {\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 1) {\n errors.push({\n type: 'error',\n description: 'Required `if` condition',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n break;\n }\n const conditionNode = args[0]!;\n statementStates.push({\n kind: 'if',\n startRange: token.range,\n condition: conditionNode,\n then: createBranchState(),\n else: createBranchState(),\n currentBlock: 'then',\n });\n break;\n }\n case 'else': {\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 0) {\n errors.push({\n type: 'error',\n description: 'Could not take any arguments in `else` statement',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n }\n if (statementStates.length <= 1) {\n errors.push({\n type: 'error',\n description: 'Cound not find pair of `if` statement',\n range: token.range,\n });\n break;\n }\n const lastState = statementStates[statementStates.length - 1]!;\n if (lastState.kind !== 'if') {\n errors.push({\n type: 'error',\n description: 'Cound not find pair of `if` statement',\n range: token.range,\n });\n break;\n }\n if (lastState.currentBlock === 'else') {\n errors.push({\n type: 'error',\n description: 'Duplicated `else` statement',\n range: token.range,\n });\n break;\n }\n flushExpressions(lastState.then);\n lastState.currentBlock = 'else';\n break;\n }\n case 'while': {\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 1) {\n errors.push({\n type: 'error',\n description: 'Required `while` condition',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n break;\n }\n const conditionNode = args[0]!;\n statementStates.push({\n kind: 'while',\n startRange: token.range,\n condition: conditionNode,\n repeat: createBranchState(),\n });\n break;\n }\n case 'for': {\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 2) {\n errors.push({\n type: 'error',\n description:\n 'Required `for` bind identity and iterable expression',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n break;\n }\n const bindNode = args[0]!;\n if (bindNode.kind !== 'variable') {\n errors.push({\n type: 'error',\n description: 'Required `for` bind identity',\n range: bindNode.range,\n });\n break;\n }\n const iterableNode = args[1]!;\n statementStates.push({\n kind: 'for',\n startRange: token.range,\n bind: bindNode,\n iterable: iterableNode,\n repeat: createBranchState(),\n });\n break;\n }\n case 'end': {\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 0) {\n errors.push({\n type: 'error',\n description: 'Could not take any arguments in `end` statement',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n }\n if (statementStates.length <= 1) {\n errors.push({\n type: 'error',\n description:\n 'Cound not find pair of `if`,`while` or `for` statement',\n range: token.range,\n });\n break;\n }\n const lastState = statementStates.pop()!;\n flushStatementState(lastState);\n switch (lastState.kind) {\n case 'if': {\n pushNode(statementStates, {\n kind: 'if',\n condition: lastState.condition,\n then: lastState.then.blocks,\n else: lastState.else.blocks,\n range: widerRange(\n lastState.startRange,\n lastState.condition.range,\n ...lastState.then.blocks.map((node) => node.range),\n ...lastState.else.blocks.map((node) => node.range),\n token.range\n ),\n });\n break;\n }\n case 'while': {\n pushNode(statementStates, {\n kind: 'while',\n condition: lastState.condition,\n repeat: lastState.repeat.blocks,\n range: widerRange(\n lastState.startRange,\n lastState.condition.range,\n ...lastState.repeat.blocks.map((node) => node.range),\n token.range\n ),\n });\n break;\n }\n case 'for': {\n pushNode(statementStates, {\n kind: 'for',\n bind: lastState.bind,\n iterable: lastState.iterable,\n repeat: lastState.repeat.blocks,\n range: widerRange(\n lastState.startRange,\n lastState.bind.range,\n ...lastState.repeat.blocks.map((node) => node.range),\n token.range\n ),\n });\n break;\n }\n }\n break;\n }\n case 'set': {\n // `set foo 123`\n cursor.takeToken();\n const args = parseStatementArguments(cursor, errors);\n if (args.length !== 2) {\n errors.push({\n type: 'error',\n description: 'Required `set` bind identity and expression',\n range: widerRange(\n token.range,\n ...args.map((node) => node.range)\n ),\n });\n break;\n }\n const bindNode = args[0]!;\n if (bindNode.kind !== 'variable') {\n errors.push({\n type: 'error',\n description: 'Required `set` bind identity',\n range: bindNode.range,\n });\n break;\n }\n const exprNode = args[1]!;\n pushNode(statementStates, {\n kind: 'set',\n name: bindNode,\n expr: exprNode,\n range: widerRange(token.range, bindNode.range, exprNode.range),\n });\n break;\n }\n default: {\n const node = parseExpression(cursor, errors);\n if (node) {\n pushNode(statementStates, node);\n }\n break;\n }\n }\n break;\n }\n default: {\n if (!isInExpressionBlock) {\n errors.push({\n type: 'error',\n description: `Invalid ${token.kind} (tokenizer bug?)`,\n range: token.range,\n });\n break;\n }\n const node = parseExpression(cursor, errors);\n if (node) {\n pushNode(statementStates, node);\n }\n break;\n }\n }\n }\n\n flushStatementState(rootState);\n if (statementStates.length !== 1) {\n errors.push({\n type: 'error',\n description: `Could not find statement closing`,\n range: widerRange(...statementStates.map((state) => state.startRange)),\n });\n }\n return rootState.branch.blocks;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst createParserCursor = (\n tokens: readonly MtrScriptToken[]\n): ParserCursor => {\n let index = 0;\n\n const peekToken = () => {\n return tokens[index];\n };\n\n const takeToken = () => {\n if (index >= tokens.length) {\n return undefined;\n }\n const token = tokens[index];\n index++;\n return token;\n };\n\n return {\n peekToken,\n takeToken,\n };\n};\n\n/**\n * Run the parser.\n * @param tokens - Token list\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Parsed node list\n */\nexport const runParser = (\n tokens: readonly MtrScriptToken[],\n errors: MtrScriptErrorInfo[]\n): MtrScriptBlockNode[] => {\n const cursor = createParserCursor(tokens);\n\n const blockNodes = parseBlock(cursor, errors);\n return blockNodes;\n};\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport {\n fromError,\n asIterable,\n type MtrScriptErrorInfo,\n type MtrScriptVariables,\n isConditionalTrue,\n isSpecialFunction,\n} from './scripting';\nimport type {\n MtrScriptExpressionNode,\n MtrScriptLambdaNode,\n MtrScriptBlockNode,\n MtrScriptVariableNode,\n} from './parser';\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * Variable value result.\n */\nexport interface ValueResult {\n /**\n * Variable value.\n */\n readonly value: unknown;\n /**\n * Is this found?\n */\n readonly isFound: boolean;\n}\n\n/**\n * Native function context.\n */\nexport interface MtrScriptFunctionContext {\n /**\n * Current scope variables.\n */\n readonly variables: any;\n /**\n * Current function application node.\n */\n readonly thisNode: MtrScriptExpressionNode;\n /**\n * Reduce expression node with this context.\n * @param node - Target node\n * @returns Reduced value.\n */\n readonly reduce: (node: MtrScriptExpressionNode) => Promise<unknown>;\n /**\n * Append directly error information.\n * @param error - Error or warning information.\n */\n readonly appendError: (error: MtrScriptErrorInfo) => void;\n}\n\n/**\n * The reducer context.\n */\nexport interface MtrScriptReducerContext {\n /**\n * Get current context (scope) variable value.\n * @param name - Variable name\n * @returns Variable value information\n */\n readonly getValue: (name: string) => ValueResult;\n /**\n * Set current context (scope) variable value.\n * @param name - Variable name\n * @param value - New value\n */\n readonly setValue: (name: string, value: unknown) => void;\n /**\n * Append context error.\n * @param error - Error or warning information.\n */\n readonly appendError: (error: MtrScriptErrorInfo) => void;\n /**\n * Indicate error received.\n * @returns The context is received any errors.\n */\n readonly isFailed: () => boolean;\n /**\n * Create new scoped context.\n * @returns New reducer context.\n */\n readonly newScope: () => MtrScriptReducerContext;\n /**\n * Create native function context proxy.\n * @param thisNode Current node (Indicating the current application is expected)\n * @returns Native function context proxy instance.\n */\n readonly createFunctionContext: (\n thisNode: MtrScriptExpressionNode\n ) => MtrScriptFunctionContext;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ninterface DeconstructConditionalCombineResult {\n readonly name: string;\n readonly canIgnore: boolean;\n}\n\n// Deconstruct with conditional combine syntax.\n// ex: `foo` --> foo, explicit\n// ex: `foo?` --> foo, can ignore\nconst deconstructConditionalCombine = (\n name: string\n): DeconstructConditionalCombineResult => {\n if (name.length >= 1) {\n const last = name[name.length - 1]!;\n if (last === '?') {\n return {\n name: name.substring(0, name.length - 1),\n canIgnore: true,\n };\n }\n }\n return {\n name,\n canIgnore: false,\n };\n};\n\n// Traverse variable with dot-notation.\n// ex: `foo` --> foo or cause error\n// ex: `foo?` --> foo or undefined\n// ex: `foo.bar.baz` --> traverse to baz or cause error\n// ex: `foo?.bar?.baz` --> traverse to baz may undefined incompletion or cause error (at the tail baz)\nconst traverseVariable = (\n context: MtrScriptReducerContext,\n name: MtrScriptVariableNode\n) => {\n const names = name.name.split('.');\n const n0 = names[0]!;\n const n0r = deconstructConditionalCombine(n0);\n const result0 = context.getValue(n0r.name);\n if (!result0.isFound) {\n if (!n0r.canIgnore) {\n context.appendError({\n type: 'error',\n description: `variable is not bound: ${names[0]}`,\n range: name.range,\n });\n }\n return undefined;\n }\n let value = result0.value;\n for (const n of names.slice(1)) {\n const nr = deconstructConditionalCombine(n);\n if (typeof value === 'object') {\n const r = value as Record<string, unknown>;\n const v = r[nr.name];\n value = v;\n } else {\n if (!nr.canIgnore) {\n context.appendError({\n type: 'error',\n description: `variable is not bound: ${n}`,\n range: name.range,\n });\n }\n return undefined;\n }\n }\n return value;\n};\n\n// Create native function object from lambda node.\nconst fromLambda = (\n context: MtrScriptReducerContext,\n lambda: MtrScriptLambdaNode\n): Function => {\n return async (...args: readonly unknown[]) => {\n if (args.length < lambda.names.length) {\n context.appendError({\n type: 'error',\n description: `Arguments are not filled: ${args.length} < ${lambda.names.length}`,\n range: lambda.range,\n });\n return undefined;\n } else if (args.length > lambda.names.length) {\n context.appendError({\n type: 'warning',\n description: `Too many arguments: ${args.length} > ${lambda.names.length}`,\n range: lambda.range,\n });\n }\n const newContext = context.newScope();\n for (let index = 0; index < lambda.names.length; index++) {\n newContext.setValue(lambda.names[index]!.name, args[index]);\n }\n const result = await reduceExpressionNode(newContext, lambda.body);\n return result;\n };\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * Reduce expression node.\n * @param context - Reducer context\n * @param node - Target expression node\n * @returns Reduced native value\n */\nexport const reduceExpressionNode = async (\n context: MtrScriptReducerContext,\n node: MtrScriptExpressionNode\n): Promise<unknown> => {\n switch (node.kind) {\n case 'number':\n case 'string': {\n return node.value;\n }\n case 'variable': {\n return traverseVariable(context, node);\n }\n case 'apply': {\n const func = await reduceExpressionNode(context, node.func);\n if (typeof func !== 'function') {\n context.appendError({\n type: 'error',\n description: 'could not apply it for function',\n range: node.range,\n });\n return undefined;\n }\n const thisProxy = context.createFunctionContext(node);\n if (isSpecialFunction(func)) {\n const value = await func.call(thisProxy, ...node.args);\n return value;\n } else {\n const args = await Promise.all(\n node.args.map(async (argNode) => {\n try {\n const arg = await reduceExpressionNode(context, argNode);\n return arg;\n } catch (e: unknown) {\n context.appendError({\n type: 'error',\n description: fromError(e),\n range: argNode.range,\n });\n return undefined;\n }\n })\n );\n const value = await func.call(thisProxy, ...args);\n return value;\n }\n }\n case 'lambda': {\n return fromLambda(context, node);\n }\n case 'list': {\n const results = await Promise.all(\n node.items.map((item) => reduceExpressionNode(context, item))\n );\n return results;\n }\n case 'set': {\n const expr = await reduceExpressionNode(context, node.expr);\n context.setValue(node.name.name, expr);\n return undefined;\n }\n case 'scope': {\n if (node.nodes.length === 0) {\n return [];\n }\n let index = 0;\n while (!context.isFailed()) {\n const result = await reduceExpressionNode(context, node.nodes[index]!);\n index++;\n if (index >= node.nodes.length) {\n return result;\n }\n }\n return undefined;\n }\n }\n};\n\n/**\n * Reduce a node.\n * @param context - Reducer context\n * @param node - Target node\n * @returns Reduced native value list\n */\nexport const reduceNode = async (\n context: MtrScriptReducerContext,\n node: MtrScriptBlockNode\n): Promise<unknown[]> => {\n switch (node.kind) {\n case 'text': {\n return [node.text];\n }\n case 'for': {\n const result = await reduceExpressionNode(context, node.iterable);\n const iterable = asIterable(result);\n if (!iterable) {\n context.appendError({\n type: 'error',\n description: 'could not apply it for function',\n range: node.range,\n });\n return [];\n }\n const resultList: unknown[] = [];\n for (const item of iterable) {\n if (context.isFailed()) {\n break;\n }\n context.setValue(node.bind.name, item);\n for (const repeat of node.repeat) {\n const results = await reduceNode(context, repeat);\n resultList.push(...results);\n }\n }\n return resultList;\n }\n case 'while': {\n const resultList: unknown[] = [];\n while (!context.isFailed()) {\n const condition = await reduceExpressionNode(context, node.condition);\n if (!isConditionalTrue(condition)) {\n break;\n }\n for (const repeat of node.repeat) {\n const results = await reduceNode(context, repeat);\n resultList.push(...results);\n }\n }\n return resultList;\n }\n case 'if': {\n const resultList: unknown[] = [];\n const condition = await reduceExpressionNode(context, node.condition);\n if (isConditionalTrue(condition)) {\n for (const then of node.then) {\n const results = await reduceNode(context, then);\n resultList.push(...results);\n }\n } else {\n for (const els of node.else) {\n const results = await reduceNode(context, els);\n resultList.push(...results);\n }\n }\n return resultList;\n }\n default: {\n const result = await reduceExpressionNode(context, node);\n return [result];\n }\n }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create reducer context.\n * @param variables - Predefined variables\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Reducer context\n */\nexport const createReducerContext = (\n variables: MtrScriptVariables,\n errors: MtrScriptErrorInfo[]\n): MtrScriptReducerContext => {\n let vs = variables;\n let mvs: Map<string, unknown> | undefined;\n let variablesProxy: any;\n\n const getValue = (name: string): ValueResult => {\n if (vs.has(name)) {\n return { value: vs.get(name), isFound: true };\n } else {\n return { value: undefined, isFound: false };\n }\n };\n\n const setValue = (name: string, value: unknown) => {\n // Clone (makes scoped) and update it.\n if (!mvs) {\n mvs = new Map(vs);\n vs = mvs;\n }\n mvs.set(name, value);\n\n // Updates variable proxy when already created.\n if (variablesProxy !== undefined) {\n Object.defineProperty(variablesProxy, name, {\n get() {\n return vs.get(name);\n },\n configurable: true,\n enumerable: true,\n });\n }\n };\n\n const appendError = (error: MtrScriptErrorInfo) => {\n errors.push(error);\n };\n\n const isFailed = () => {\n return errors.some((error) => error.type === 'error');\n };\n\n const newScope = () => {\n const newContext = createReducerContext(vs, errors);\n return newContext;\n };\n\n let context: MtrScriptReducerContext;\n const reduceByProxy = (node: MtrScriptExpressionNode) =>\n reduceExpressionNode(context, node);\n const getVariablesFromProxy = () => {\n // Makes cached variable proxy.\n if (variablesProxy === undefined) {\n variablesProxy = {};\n for (const key of vs.keys()) {\n Object.defineProperty(variablesProxy, key, {\n get: () => vs.get(key),\n configurable: true,\n enumerable: true,\n });\n }\n }\n return variablesProxy;\n };\n\n const createFunctionContext = (\n thisNode: MtrScriptExpressionNode\n ): MtrScriptFunctionContext => {\n return {\n get variables() {\n return getVariablesFromProxy();\n },\n thisNode,\n appendError,\n reduce: reduceByProxy,\n } as const;\n };\n\n context = {\n getValue,\n setValue,\n appendError,\n isFailed,\n newScope,\n createFunctionContext,\n };\n return context;\n};\n\n// Unwrap nested results and will remove `undefined` results.\nconst unwrap = (results: unknown[]): unknown[] => {\n return results.flatMap<unknown>((result) => {\n if (result === undefined) {\n return [];\n } else {\n return [result];\n }\n });\n};\n\n/**\n * Run the reducer.\n * @param node - Target node\n * @param variables - Predefined variables\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Reduced native value list\n */\nexport function runReducer(\n node: MtrScriptBlockNode,\n variables: MtrScriptVariables,\n errors: MtrScriptErrorInfo[]\n): Promise<unknown[]>;\n\n/**\n * Run the reducer.\n * @param node - Target node list\n * @param variables - Predefined variables\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Reduced native value list\n */\nexport function runReducer(\n nodes: readonly MtrScriptBlockNode[],\n variables: MtrScriptVariables,\n errors: MtrScriptErrorInfo[]\n): Promise<unknown[]>;\n\n/**\n * Run the reducer.\n * @param node - Target nodes\n * @param variables - Predefined variables\n * @param errors - Will be stored detected warnings/errors into it\n * @returns Reduced native values\n */\nexport async function runReducer(\n nodes: readonly MtrScriptBlockNode[] | MtrScriptBlockNode,\n variables: MtrScriptVariables,\n errors: MtrScriptErrorInfo[]\n): Promise<unknown[]> {\n const context = createReducerContext(variables, errors);\n if (Array.isArray(nodes)) {\n // Root list \"ABC{{def ghi}}JKL\" is reduced each expressions in sequential.\n const resultList: unknown[] = [];\n for (const node of nodes) {\n const results = await reduceNode(context, node);\n resultList.push(...results);\n }\n return unwrap(resultList);\n } else {\n const results = await reduceNode(context, nodes as MtrScriptExpressionNode);\n return unwrap(results);\n }\n}\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport {\n asIterable,\n combineVariables,\n isConditionalTrue,\n makeSpecialFunction,\n type MtrScriptVariables,\n} from './scripting';\nimport { MtrScriptExpressionNode } from './parser';\nimport { MtrScriptFunctionContext } from './reducer';\n\n//////////////////////////////////////////////////////////////////////////////\n\n// `cond` function requires delayed execution both then/else expressions.\nconst _cond = makeSpecialFunction(async function (\n this: MtrScriptFunctionContext,\n arg0: MtrScriptExpressionNode,\n arg1: MtrScriptExpressionNode,\n arg2: MtrScriptExpressionNode\n) {\n const cond = await this.reduce(arg0);\n if (isConditionalTrue(cond)) {\n return await this.reduce(arg1); // Delayed execution when condition is true.\n } else {\n return await this.reduce(arg2); // Delayed execution when condition is false.\n }\n});\n\nconst _typeof = async (arg0: unknown) => {\n if (arg0 === null) {\n return 'null';\n } else if (typeof arg0 === 'string') {\n return 'string';\n } else if (Array.isArray(arg0)) {\n return 'array';\n } else if (asIterable(arg0)) {\n return 'iterable';\n } else {\n return typeof arg0;\n }\n};\n\nconst funcIds = new WeakMap<Function, number>();\nlet nextId = 1;\n\nconst getFuncId = (fn: Function) => {\n const cached = funcIds.get(fn);\n if (cached) return cached;\n const id = nextId++;\n funcIds.set(fn, id);\n return id;\n};\n\nconst _toString = async (...args: unknown[]) => {\n const results = args.map((arg0) => {\n switch (arg0) {\n case undefined:\n return '(undefined)';\n case null:\n return '(null)';\n default:\n switch (typeof arg0) {\n case 'string':\n return arg0;\n case 'boolean':\n return arg0 ? 'true' : 'false';\n case 'number':\n case 'bigint':\n case 'symbol':\n return arg0.toString();\n case 'function':\n if (arg0.name) {\n return `fun<${arg0.name}:#${getFuncId(arg0)}>`;\n } else {\n return `fun<#${getFuncId(arg0)}>`;\n }\n default:\n if (Array.isArray(arg0)) {\n return JSON.stringify(arg0);\n }\n const iterable = asIterable(arg0);\n if (iterable) {\n const arr = Array.from(iterable);\n return JSON.stringify(arr);\n } else {\n return JSON.stringify(arg0);\n }\n }\n }\n });\n return results.join(',');\n};\n\nconst _add = async (arg0: unknown, ...args: unknown[]) => {\n const r = args.reduce((v0: number, v) => v0 + Number(v), Number(arg0));\n return r;\n};\n\nconst _sub = async (arg0: unknown, ...args: unknown[]) => {\n const r = args.reduce((v0: number, v) => v0 - Number(v), Number(arg0));\n return r;\n};\n\nconst _mul = async (arg0: unknown, ...args: unknown[]) => {\n const r = args.reduce((v0: number, v) => v0 * Number(v), Number(arg0));\n return r;\n};\n\nconst _div = async (arg0: unknown, ...args: unknown[]) => {\n const r = args.reduce((v0: number, v) => v0 / Number(v), Number(arg0));\n return r;\n};\n\nconst _mod = async (arg0: unknown, ...args: unknown[]) => {\n const r = args.reduce((v0: number, v) => v0 % Number(v), Number(arg0));\n return r;\n};\n\nconst _equal = async (arg0: unknown, arg1: unknown) => {\n const r = arg0 === arg1;\n return r;\n};\n\nconst _now = async () => {\n return Date.now();\n};\n\nconst concatInner = (args: Iterable<unknown>) => {\n let v = '';\n for (const arg of args) {\n if (typeof arg === 'string') {\n v = v + arg;\n } else {\n const iterable = asIterable(arg);\n if (iterable) {\n v = v + concatInner(iterable);\n } else {\n v = v + String(arg);\n }\n }\n }\n return v;\n};\n\nconst _concat = async (...args: unknown[]) => {\n const r = concatInner(args);\n return r;\n};\n\nconst _join = async (arg0: unknown, ...args: unknown[]) => {\n const sep = String(arg0);\n const r = args.map((v) => String(v)).join(sep);\n return r;\n};\n\nconst _trim = async (arg0: unknown) => {\n let v: any = arg0;\n if (v === undefined || v === null) {\n v = '';\n } else if (typeof v !== 'string') {\n v = v.toString() ?? '';\n }\n return v.trim();\n};\n\nconst _toUpper = async (arg0: unknown) => {\n let v: any = arg0;\n if (typeof v !== 'string') {\n v = v.toString() ?? '';\n }\n return v.toUpperCase();\n};\n\nconst _toLower = async (arg0: unknown) => {\n let v: any = arg0;\n if (typeof v !== 'string') {\n v = v.toString() ?? '';\n }\n return v.toLowerCase();\n};\n\nconst _length = async (arg0: unknown) => {\n if (arg0) {\n if (typeof arg0 === 'string') {\n return arg0.length;\n } else if (Array.isArray(arg0)) {\n return arg0.length;\n } else {\n const iterable = asIterable(arg0);\n if (iterable) {\n let count = 0;\n for (const _item of arg0 as Iterable<unknown>) {\n count++;\n }\n return count;\n }\n }\n }\n return 0;\n};\n\nconst _and = async (...args: unknown[]) => {\n if (args.length === 0) {\n throw new Error('empty arguments');\n }\n const r = args.reduce((v0: boolean, v) => v0 && isConditionalTrue(v), true);\n return r;\n};\n\nconst _or = async (...args: unknown[]) => {\n if (args.length === 0) {\n throw new Error('empty arguments');\n }\n const r = args.reduce((v0: boolean, v) => v0 || isConditionalTrue(v), false);\n return r;\n};\n\nconst _not = async (arg0: unknown) => {\n return !isConditionalTrue(arg0);\n};\n\nconst _at = async (arg0: unknown, arg1: unknown) => {\n const index = Number(arg0);\n if (arg1) {\n if (typeof arg1 === 'string') {\n return arg1[index];\n } else if (Array.isArray(arg1)) {\n return arg1[index];\n } else {\n const iterable = asIterable(arg1);\n if (iterable) {\n let current = 0;\n for (const item of iterable) {\n if (current >= index) {\n return item;\n }\n current++;\n }\n }\n }\n }\n return undefined;\n};\n\nconst _first = async (arg0: unknown) => {\n if (arg0) {\n if (typeof arg0 === 'string') {\n return arg0[0];\n } else if (Array.isArray(arg0)) {\n return arg0[0];\n } else {\n const iterable = asIterable(arg0);\n if (iterable) {\n for (const item of iterable) {\n return item;\n }\n }\n }\n }\n return undefined;\n};\n\nconst _last = async (arg0: unknown) => {\n if (arg0) {\n if (typeof arg0 === 'string') {\n return arg0[arg0.length - 1];\n } else if (Array.isArray(arg0)) {\n return arg0[arg0.length - 1];\n } else {\n const iterable = asIterable(arg0);\n if (iterable) {\n let lastItem: unknown = undefined;\n for (const item of iterable) {\n lastItem = item;\n }\n return lastItem;\n }\n }\n }\n return undefined;\n};\n\nconst _range = async (arg0: unknown, arg1: unknown) => {\n let value = Number(arg0);\n const count = Number(arg1);\n const resultList: unknown[] = [];\n for (let index = 0; index < count; index++) {\n resultList.push(value++);\n }\n return resultList;\n};\n\nconst _reverse = async (arg0: unknown) => {\n const iter = arg0 as Iterable<unknown>;\n let resultList: unknown[] = [];\n for (const item of iter) {\n resultList.push(item);\n }\n return resultList.reverse();\n};\n\nconst _sort = async (arg0: unknown) => {\n const iter = arg0 as Iterable<unknown>;\n let resultList: unknown[] = [];\n for (const item of iter) {\n resultList.push(item);\n }\n return resultList.sort();\n};\n\nconst _map = async (arg0: unknown, arg1: unknown) => {\n const predicate = arg0 as Function;\n const iter = arg1 as Iterable<unknown>;\n const resultList: unknown[] = [];\n for (const item of iter) {\n const result = await predicate(item);\n resultList.push(result);\n }\n return resultList;\n};\n\nconst _flatMap = async (arg0: unknown, arg1: unknown) => {\n const predicate = arg0 as Function;\n const iter = arg1 as Iterable<unknown>;\n const resultList: unknown[] = [];\n for (const item of iter) {\n const results = await predicate(item);\n resultList.push(...results);\n }\n return resultList;\n};\n\nconst _filter = async (arg0: unknown, arg1: unknown) => {\n const predicate = arg0 as Function;\n const iter = arg1 as Iterable<unknown>;\n const resultList: unknown[] = [];\n for (const item of iter) {\n const result = await predicate(item);\n if (isConditionalTrue(result)) {\n resultList.push(item);\n }\n }\n return resultList;\n};\n\nconst _collect = async (arg0: unknown) => {\n const iter = arg0 as Iterable<unknown>;\n const resultList: unknown[] = [];\n for (const item of iter) {\n if (item !== undefined && item !== null) {\n resultList.push(item);\n }\n }\n return resultList;\n};\n\nconst _reduce = async (arg0: unknown, arg1: unknown, arg2: unknown) => {\n let acc = arg0;\n const predicate = arg1 as Function;\n const iter = arg2 as Iterable<unknown>;\n for (const item of iter) {\n acc = await predicate(acc, item);\n }\n return acc;\n};\n\nconst _match = async (arg0: unknown, arg1: unknown) => {\n const re = arg0 instanceof RegExp ? arg0 : new RegExp(String(arg0), 'g');\n const results = String(arg1).match(re);\n return results;\n};\n\nconst _replace = async (arg0: unknown, arg1: unknown, arg2: unknown) => {\n const re = arg0 instanceof RegExp ? arg0 : new RegExp(String(arg0), 'g');\n const replace = String(arg1);\n const results = String(arg2).replace(re, replace);\n return results;\n};\n\nconst _regex = async (arg0: unknown, arg1: unknown) => {\n if (arg1) {\n const re = new RegExp(String(arg0), String(arg1));\n return re;\n } else {\n const re = new RegExp(String(arg0));\n return re;\n }\n};\n\nconst _bind = async (arg0: unknown, ...args: unknown[]) => {\n const predicate = arg0 as Function;\n return predicate.bind(undefined, ...args);\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\n// Standard variables\nexport const standardVariables = {\n undefined: undefined,\n null: null,\n true: true,\n false: false,\n cond: _cond,\n toString: _toString,\n typeof: _typeof,\n add: _add,\n sub: _sub,\n mul: _mul,\n div: _div,\n mod: _mod,\n equal: _equal,\n now: _now,\n concat: _concat,\n join: _join,\n trim: _trim,\n toUpper: _toUpper,\n toLower: _toLower,\n length: _length,\n and: _and,\n or: _or,\n not: _not,\n at: _at,\n first: _first,\n last: _last,\n range: _range,\n sort: _sort,\n reverse: _reverse,\n map: _map,\n flatMap: _flatMap,\n filter: _filter,\n collect: _collect,\n reduce: _reduce,\n match: _match,\n replace: _replace,\n regex: _regex,\n bind: _bind,\n} as const;\n\nexport const buildCandidateVariables = (\n ...variablesList: readonly (MtrScriptVariables | Record<string, unknown>)[]\n): MtrScriptVariables => {\n return combineVariables(standardVariables, ...variablesList);\n};\n"],"names":["node","expr"],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ /*!
2
+ * name: funcity
3
+ * version: 0.1.0
4
+ * description: A functional language interpreter with text processing
5
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
+ * license: MIT
7
+ * repository.url: https://github.com/kekyo/funcity.git
8
+ * git.commit.hash: 5652ca56084e46cd208085f10c65ec7ad06b848a
9
+ */
10
+
11
+ import { MtrScriptErrorInfo, MtrScriptRange } from './scripting';
12
+ import { MtrScriptToken } from './tokenizer';
13
+ /**
14
+ * String expression node.
15
+ */
16
+ export interface MtrScriptStringNode {
17
+ readonly kind: 'string';
18
+ /**
19
+ * String value.
20
+ */
21
+ readonly value: string;
22
+ readonly range: MtrScriptRange;
23
+ }
24
+ /**
25
+ * Number (numeric) expression node.
26
+ */
27
+ export interface MtrScriptNumberNode {
28
+ readonly kind: 'number';
29
+ /**
30
+ * Numeric value.
31
+ */
32
+ readonly value: number;
33
+ readonly range: MtrScriptRange;
34
+ }
35
+ /**
36
+ * Variable (identity) expression node.
37
+ */
38
+ export interface MtrScriptVariableNode {
39
+ readonly kind: 'variable';
40
+ /**
41
+ * Variable name.
42
+ */
43
+ readonly name: string;
44
+ readonly range: MtrScriptRange;
45
+ }
46
+ /**
47
+ * Application expression node.
48
+ */
49
+ export interface MtrScriptApplyNode {
50
+ readonly kind: 'apply';
51
+ /**
52
+ * Application target node.
53
+ */
54
+ readonly func: MtrScriptExpressionNode;
55
+ /**
56
+ * Application arguments.
57
+ */
58
+ readonly args: readonly MtrScriptExpressionNode[];
59
+ readonly range: MtrScriptRange;
60
+ }
61
+ /**
62
+ * Lambda expression node.
63
+ */
64
+ export interface MtrScriptLambdaNode {
65
+ readonly kind: 'lambda';
66
+ /**
67
+ * Parameter names.
68
+ */
69
+ readonly names: readonly MtrScriptVariableNode[];
70
+ /**
71
+ * Lambda body expression.
72
+ */
73
+ readonly body: MtrScriptExpressionNode;
74
+ readonly range: MtrScriptRange;
75
+ }
76
+ /**
77
+ * Expression list (array) node.
78
+ */
79
+ export interface MtrScriptListNode {
80
+ readonly kind: 'list';
81
+ /**
82
+ * List item nodes.
83
+ */
84
+ readonly items: readonly MtrScriptExpressionNode[];
85
+ readonly range: MtrScriptRange;
86
+ }
87
+ /**
88
+ * Variable setter node.
89
+ */
90
+ export interface MtrScriptSetNode {
91
+ readonly kind: 'set';
92
+ /**
93
+ * Target variable name.
94
+ */
95
+ readonly name: MtrScriptVariableNode;
96
+ /**
97
+ * Will be set the value from reduced expression.
98
+ */
99
+ readonly expr: MtrScriptExpressionNode;
100
+ readonly range: MtrScriptRange;
101
+ }
102
+ /**
103
+ * Evaluate child scope node.
104
+ */
105
+ export interface MtrScriptScopeNode {
106
+ readonly kind: 'scope';
107
+ /**
108
+ * Scoped node list.
109
+ * @remarks Reduced each nodes, but takes last one reduced value.
110
+ */
111
+ readonly nodes: readonly MtrScriptExpressionNode[];
112
+ readonly range: MtrScriptRange;
113
+ }
114
+ /**
115
+ * The expression node.
116
+ */
117
+ export type MtrScriptExpressionNode = MtrScriptNumberNode | MtrScriptStringNode | MtrScriptVariableNode | MtrScriptApplyNode | MtrScriptLambdaNode | MtrScriptListNode | MtrScriptSetNode | MtrScriptScopeNode;
118
+ /**
119
+ * Text block node.
120
+ */
121
+ export interface MtrScriptTextNode {
122
+ readonly kind: 'text';
123
+ /**
124
+ * Text body.
125
+ */
126
+ readonly text: string;
127
+ readonly range: MtrScriptRange;
128
+ }
129
+ /**
130
+ * Conditional branch (`if`) block node contains else block.
131
+ */
132
+ export interface MtrScriptIfNode {
133
+ readonly kind: 'if';
134
+ /**
135
+ * Condition expression node.
136
+ */
137
+ readonly condition: MtrScriptExpressionNode;
138
+ /**
139
+ * Then (true) block node.
140
+ */
141
+ readonly then: readonly MtrScriptBlockNode[];
142
+ /**
143
+ * Else (false) block node.
144
+ */
145
+ readonly else: readonly MtrScriptBlockNode[];
146
+ readonly range: MtrScriptRange;
147
+ }
148
+ /**
149
+ * Conditional repeats (`while`) block node contains else block.
150
+ */
151
+ export interface MtrScriptWhileNode {
152
+ readonly kind: 'while';
153
+ /**
154
+ * Condition expression node.
155
+ */
156
+ readonly condition: MtrScriptExpressionNode;
157
+ /**
158
+ * Repeat block node.
159
+ */
160
+ readonly repeat: readonly MtrScriptBlockNode[];
161
+ readonly range: MtrScriptRange;
162
+ }
163
+ /**
164
+ * Item iteration (`for`) block node contains else block.
165
+ */
166
+ export interface MtrScriptForNode {
167
+ readonly kind: 'for';
168
+ /**
169
+ * Bind variable node in each iteration.
170
+ */
171
+ readonly bind: MtrScriptVariableNode;
172
+ /**
173
+ * Iteration target expression node.
174
+ */
175
+ readonly iterable: MtrScriptExpressionNode;
176
+ /**
177
+ * Repeat block node.
178
+ */
179
+ readonly repeat: readonly MtrScriptBlockNode[];
180
+ readonly range: MtrScriptRange;
181
+ }
182
+ /**
183
+ * The block node.
184
+ */
185
+ export type MtrScriptBlockNode = MtrScriptExpressionNode | MtrScriptTextNode | MtrScriptIfNode | MtrScriptWhileNode | MtrScriptForNode;
186
+ interface ParserCursor {
187
+ /**
188
+ * Peek one token.
189
+ * @returns A token or undefined when reached end of token.
190
+ */
191
+ peekToken: () => MtrScriptToken | undefined;
192
+ /**
193
+ * Get one token and advance.
194
+ * @returns A token or undefined when reached end of token.
195
+ */
196
+ takeToken: () => MtrScriptToken | undefined;
197
+ }
198
+ /**
199
+ * Parse expression in the signle line.
200
+ * @param cursor Parser cursor
201
+ * @param errors - Will be stored detected warnings/errors into it
202
+ * @returns Parsed expression node when available
203
+ */
204
+ export declare const parseExpression: (cursor: ParserCursor, errors: MtrScriptErrorInfo[]) => MtrScriptExpressionNode | undefined;
205
+ /**
206
+ * Parse blocks.
207
+ * @param cursor Parser cursor
208
+ * @param errors - Will be stored detected warnings/errors into it
209
+ * @returns Parsed expression node when available
210
+ */
211
+ export declare const parseBlock: (cursor: ParserCursor, errors: MtrScriptErrorInfo[]) => MtrScriptBlockNode[];
212
+ /**
213
+ * Run the parser.
214
+ * @param tokens - Token list
215
+ * @param errors - Will be stored detected warnings/errors into it
216
+ * @returns Parsed node list
217
+ */
218
+ export declare const runParser: (tokens: readonly MtrScriptToken[], errors: MtrScriptErrorInfo[]) => MtrScriptBlockNode[];
219
+ export {};
220
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}