Comparing version 0.17.0 to 0.18.0
{ | ||
"name": "feelin", | ||
"version": "0.17.0", | ||
"version": "0.18.0", | ||
"description": "A FEEL parser and interpreter", | ||
@@ -41,6 +41,6 @@ "main": "dist/index.js", | ||
"build-parser": "run-s build-parser:*", | ||
"build-parser:expr:watch": "chokidar --initial src/feel.grammar -c \"npm run build-parser:expr -- --names\"", | ||
"build-parser:expr": "lezer-generator src/feel.grammar -o src/parser", | ||
"build-parser:unary:watch": "chokidar --initial src/feel-unary.grammar -c \"npm run build-parser:unary -- --names\"", | ||
"build-parser:unary": "lezer-generator src/feel-unary.grammar -o src/unary-parser", | ||
"build-parser:expr:watch": "chokidar --initial src/grammar/expression.grammar -c \"npm run build-parser:expr -- --names\"", | ||
"build-parser:expr": "lezer-generator src/grammar/expression.grammar -o src/grammar/expression-parser", | ||
"build-parser:unary:watch": "chokidar --initial src/grammar/unary-test.grammar -c \"npm run build-parser:unary -- --names\"", | ||
"build-parser:unary": "lezer-generator src/grammar/unary-test.grammar -o src/grammar/unary-test-parser", | ||
"build": "rollup -c", | ||
@@ -47,0 +47,0 @@ "prepublishOnly": "run-s build-parser build", |
@@ -16,4 +16,4 @@ ## Feelin | ||
unaryTest(1, '1'); // true | ||
unaryTest(1, '[1..end]', { end: 10 }); // true | ||
unaryTest('1', { '?': 1 }); // true | ||
unaryTest('[1..end]', { '?': 1, end: 10 }); // true | ||
@@ -36,5 +36,5 @@ evaluate("Mike's dauther.name", { | ||
* [x] Support all FEEL operations | ||
* [x] Support names with spaces | ||
* [x] Recover on errors | ||
* [x] Recognizes full FEEL grammar | ||
* [x] Supports names with spaces | ||
* [x] Recovers on errors | ||
* [ ] Provides built-in functions | ||
@@ -41,0 +41,0 @@ * [ ] Passes all FEEL tests in the [DMN TCK](https://github.com/dmn-tck/tck) |
@@ -0,1 +1,5 @@ | ||
import { | ||
is | ||
} from './types'; | ||
const names = [ | ||
@@ -29,3 +33,2 @@ | ||
// 10.3.4.4 List functions | ||
'list contains', | ||
@@ -86,3 +89,2 @@ 'count', | ||
// 10.3.4.8 Temporal built-in functions | ||
'day of year', | ||
@@ -94,3 +96,2 @@ 'day of week', | ||
// 10.3.4.9 Sort | ||
'sort', | ||
@@ -142,3 +143,3 @@ | ||
'not': fn(function(bool) { | ||
return !bool; | ||
return is(bool, 'Boolean') ? !bool : null; | ||
}, [ 'any' ]), | ||
@@ -145,0 +146,0 @@ |
@@ -1,29 +0,62 @@ | ||
import { interpreter } from './interpreter'; | ||
import { | ||
parser as expressionGrammarParser | ||
} from './grammar/expression-parser'; | ||
function unaryTest(input, expression, context) { | ||
import { | ||
parser as unaryTestGrammarParser | ||
} from './grammar/unary-test-parser'; | ||
return interpreter.unaryTest(expression, { | ||
...context, | ||
'?': input | ||
}); | ||
import { | ||
Interpreter | ||
} from './interpreter'; | ||
} | ||
import { | ||
Parser | ||
} from './parser'; | ||
function evaluate(expression, context) { | ||
return interpreter.evaluate(expression, context); | ||
const unaryTestParser = new Parser(unaryTestGrammarParser); | ||
const expressionParser = new Parser(expressionGrammarParser); | ||
const unaryTester = new Interpreter(unaryTestParser); | ||
const expressionEvaluator = new Interpreter(expressionParser); | ||
export function unaryTest(expression, context={}) { | ||
const value = context['?'] || null; | ||
const { | ||
root, | ||
parsedContext | ||
} = unaryTester.evaluate(expression, context); | ||
// root = fn(ctx) => test(val) | ||
const test = root(parsedContext); | ||
return test(value); | ||
} | ||
function parseExpressions(expression, context={}) { | ||
return interpreter.parseExpressions(expression, context); | ||
export function evaluate(expression, context={}) { | ||
const { | ||
root, | ||
parsedContext | ||
} = expressionEvaluator.evaluate(expression, context); | ||
// root = [ fn(ctx) ] | ||
const results = root(parsedContext); | ||
if (results.length === 1) { | ||
return results[0]; | ||
} else { | ||
return results; | ||
} | ||
} | ||
function parseUnaryTests(expression, context={}) { | ||
return interpreter.parseUnaryTests(expression, context); | ||
export function parseExpressions(expression, context={}) { | ||
return expressionParser.parse(expression, context); | ||
} | ||
export { | ||
parseExpressions, | ||
parseUnaryTests, | ||
unaryTest, | ||
evaluate | ||
}; | ||
export function parseUnaryTests(expression, context={}) { | ||
return unaryTestParser.parse(expression, context); | ||
} |
@@ -1,9 +0,1 @@ | ||
import { | ||
parser as expressionParser | ||
} from './parser'; | ||
import { | ||
parser as unaryTestParser | ||
} from './unary-parser'; | ||
import { builtins } from './builtins'; | ||
@@ -14,118 +6,10 @@ | ||
function Interpreter() { | ||
export class Interpreter { | ||
constructor(parser) { | ||
this._parser = parser; | ||
} | ||
this.parseName = (name) => { | ||
_buildExecutionTree(tree, input) { | ||
let match; | ||
const pattern = /([./\-'+*]+)|([^\s./\-'+*]+)/g; | ||
const tokens = []; | ||
let lastName = false; | ||
while ((match = pattern.exec(name))) { | ||
const [ _, additionalPart, namePart ] = match; | ||
if (additionalPart) { | ||
lastName = false; | ||
if (tokens.length) { | ||
tokens.push('\\s*'); | ||
} | ||
tokens.push(additionalPart.replace(/[+*]/g, '\\$&')); | ||
} else { | ||
if (tokens.length) { | ||
if (lastName) { | ||
tokens.push('\\s+'); | ||
} else { | ||
tokens.push('\\s*'); | ||
} | ||
} | ||
lastName = true; | ||
tokens.push(namePart); | ||
} | ||
} | ||
return tokens; | ||
}; | ||
this.findNames = (context) => { | ||
let uid = 0; | ||
return Object.keys(context).filter(key => /[\s./\-'+*]/.test(key)).map(name => { | ||
const replacement = '_' + uid.toString(36); | ||
const tokens = this.parseName(name); | ||
const replacer = new RegExp(tokens.join(''), 'g'); | ||
return { | ||
name, | ||
replacement, | ||
replacer | ||
}; | ||
}); | ||
}; | ||
this.replaceNames = (input, context, names) => { | ||
for (const { name, replacement, replacer } of names) { | ||
input = input.replace(replacer, function(match) { | ||
const placeholder = replacement.padEnd(match.length, '_'); | ||
if (!context[placeholder]) { | ||
context = { | ||
...context, | ||
[match]: context[name] | ||
}; | ||
} | ||
return placeholder; | ||
}); | ||
} | ||
return { | ||
input, | ||
context | ||
}; | ||
}; | ||
this.parse = (parser, rawInput, rawContext) => { | ||
const names = this.findNames(rawContext); | ||
const { | ||
context, | ||
input | ||
} = this.replaceNames(rawInput, rawContext, names); | ||
const tree = parser.parse(input); | ||
return { | ||
context, | ||
input, | ||
tree | ||
}; | ||
}; | ||
this.parseExpressions = (input, context) => { | ||
return this.parse(expressionParser, input, context); | ||
}; | ||
this.parseUnaryTests = (input, context) => { | ||
return this.parse(unaryTestParser, input, context); | ||
}; | ||
this.createExecutionTree = (tree, input) => { | ||
const root = { args: [] }; | ||
@@ -174,35 +58,25 @@ | ||
return root.args[root.args.length - 1]; | ||
}; | ||
} | ||
this.evaluate = (expression, context={}) => { | ||
_parse(expression, context) { | ||
return this._parser.parse(expression, context); | ||
} | ||
const { | ||
tree, | ||
context: parsedContext | ||
} = this.parseExpressions(expression, context); | ||
evaluate(expression, context={}) { | ||
const root = this.createExecutionTree(tree, expression); | ||
const results = root(parsedContext); | ||
if (results.length === 1) { | ||
return results[0]; | ||
} else { | ||
return results; | ||
} | ||
}; | ||
this.unaryTest = (expression, context={}) => { | ||
const value = context['?'] || null; | ||
const { | ||
tree, | ||
context: parsedContext | ||
} = this.parseUnaryTests(expression, context); | ||
tree: parseTree, | ||
parsedContext, | ||
parsedInput | ||
} = this._parse(expression, context); | ||
const root = this.createExecutionTree(tree, expression); | ||
const root = this._buildExecutionTree(parseTree, expression); | ||
return root(parsedContext)(value); | ||
}; | ||
return { | ||
parseTree, | ||
parsedContext, | ||
parsedInput, | ||
root | ||
}; | ||
} | ||
@@ -834,8 +708,2 @@ } | ||
}; | ||
} | ||
const interpreter = new Interpreter(); | ||
export { | ||
interpreter | ||
}; | ||
} |
@@ -1,19 +0,112 @@ | ||
// This file was generated by lezer-generator. You probably shouldn't edit it. | ||
import {Parser} from "lezer" | ||
import {NodeProp} from "lezer" | ||
export const parser = Parser.deserialize({ | ||
states: "@QOYOPOOO#}OPO(3CiOYOPO'#DOO'eOPO'#DOO*YOPO'#DYO.YOPO'#DpOXOP'#El'#ElO.YOPO'#EsOXOP'#Er'#ErOXOP'#Fw'#FwOXOP'#Fv'#FvO.^OPO'#EwOYOPO'#ExO.}OPO'#EyO.^OPO'#EvOXOP'#Ev'#EvOXOP'#Ff'#FfO1uOPO'#E}OXOP'#Fy'#FyOXOP'#Fe'#FeQYOPOOO2SOPO'#C`OYOPO'#ChO2WOPO'#ClO2[OPO'#DqO2`OPO'#DqO2dOPO'#DqO2hOPO'#DqO2oOPO'#DqO2sOPO'#DqO2wOPO'#DqO2{OPO'#DqO3POPO'#DqO3TOPO'#DqO3XOPO'#DqO3]OPO'#DqO3aOPO'#DqOXOP'#Eo'#EoO3hOPO'#EzOYOPO,59bOYOPO,59jOYOPO,59jOYOPO,59jO3lOPO,5:WOYOPO,5:XO3pOPO'#E`OXOP,5:[,5:[OYOPO,59^OYOPO,59`OYOPO,59bO6qOPO,59bO9fOPO,59pO9jOPO,59jO=jOPO,5;WOEiOPO'#FlOIiOPO'#FZOXOP,59t,59tOXOP,5;_,5;_OImOPO'#ElOXOP'#Fx'#FxOIqOPO,5;cOIuOPO,5;dOJxOPO'#FxOLUOPO'#FxOMbOPO'#FzONhOPO,5;eOXOP,5;b,5;bOXOP'#FQ'#FQONlOPO'#FPONpOPO'#F}ONwOPO,5;iON{OPO'#FROXOP,5;q,5;qO! POPO'#CdO! TOPO'#CcO! [OPO,58zO! `OPO,59SO!!cOPO'#CpO!!gOPO'#CoO!!nOPO,59WO!!rOPO,5:]OXOP,5:],5:]O!!vOPO,5:]O!!}OPO,5:]O!#ROPO,5;fO!#cOPO1G.|O!'cOPO1G/UO!+cOPO1G/UO!/cOPO1G/UOXOP1G/r1G/rO!3cOPO1G/sO!4fOPO'#EjO!5lOPO'#EbOXOP'#Eb'#EbO!6uOPO'#FsOXOP'#Ea'#EaOXOP,5:z,5:zO!6yOPO,5:zO!6}OPO'#EcO!7ROPO'#EcO!7YOPO1G.xO!;YOPO1G.zO!?YOPO1G.|O!@YOPO'#CzOYOPO1G.|OXOP1G.|1G.|O!DYOPO1G/[OXOP,5;u,5;uOXOP-E9X-E9XOXOP,5;W,5;WO.^OPO1G0}OXOP1G1O1G1OO!DpOPO'#FuOYOPO'#F_OXOP,5<f,5<fOXOP1G1P1G1POYOPO,5;kO!DzOPO'#GOO!EROPO'#FaOXOP,5<i,5<iOXOP1G1T1G1TOXOP,5;m,5;mOYOPO,59OO!E]OPO'#FhO2SOPO'#FWOXOP,58},58}OYOPO1G.fOYOPO1G.nOYOPO,59[O!EdOPO'#FjO2WOPO'#FXOXOP,59Z,59ZOYOPO1G.rO!EkOPO1G/wOXOP1G/w1G/wO!EoOPO'#E{O!EyOPO'#F{O!FQOPO1G1QOXOP7+%_7+%_OXOP,5;U,5;UOYOPO,5<_OXOP1G0f1G0fOXOP,5:},5:}OYOPO7+$hO!FUOPO'#CzO!G[OPO'#C|O!GcOPO7+$hOXOP'#DZ'#DZOXOP'#DX'#DXO!GgOPO'#DZO!GkOPO'#DZO!GoOQO'#DbO!GsOQO'#DfO!GwOQO'#DiOXOP7+$v7+$vO!G{OPO7+&iOXOP,5;y,5;yO!HVOPO-E9]O!I`OPO1G1VOXOP,5;{,5;{OXOP-E9_-E9_O!JfOPO'#CfOXOP1G.j1G.jOXOP,5;r,5;rOXOP-E9U-E9UO!KoOPO7+$QO# oOPO7+$YO#%oOPO1G.vOXOP,5;s,5;sOXOP-E9V-E9VO#&uOPO7+$^OXOP7+%c7+%cO!DYOPO,5;gO#*uOPO'#F|O#*|OPO'#F`OXOP,5<g,5<gO#+ZOPO7+&lO#.ROPO1G1yO#/XOPO<<HSO#3XOPO'#FkOYOPO'#FYOXOP,59h,59hOXOP<<HS<<HSO#3`OPO,59uO#3dOPO,59uO#3hOPO,59|O#4OOPO,5:QO#4SOQO,5:TOXOP<<JT<<JTOYOPO,59QOYOPO<<GtOXOP1G1R1G1ROXOP,5;z,5;zOXOP-E9^-E9^O#4mOPO<<JWOYOPO<<JWO#8mOPO'#FtO#*|OPO'#F^OXOP7+'e7+'eOXOP,5;t,5;tOXOP-E9W-E9WO#8tOPO1G/aO#8xOQO'#DYO#9SOQO1G/hO#9WOPO'#DhO#9[OQO1G/lOXOQ'#Dk'#DkO#9cOQO'#FpO#9jOQO1G/oO#9nOPO1G.lO#:tOPOAN=`O#>tOPOAN?rOXOP,5;x,5;xO#BtOPO,5;xOXOP7+${7+${O#BxOQO'#FlOXOP7+%S7+%SO#3hOPO,5:SO#CSOQO'#FoO#4OOPO'#F[O#CZOQO7+%WO#C_OQO'#FqO#3hOPO'#F]OXOQ,5<[,5<[O#CfOPO7+%ZOYOPO1G1dO#CjOQO1G/oOXOQ1G/n1G/nOXOQ,5;v,5;vOXOQ-E9Y-E9YOXOP<<Hr<<HrOXOQ,5;w,5;wOXOQ-E9Z-E9ZO!DYOPO<<HuO#CnOPO8;$bO#DtOPO7+%ZOXOPAN>aAN>aO#3hOPO<<Hu", | ||
stateData: "#EQQOSROS$WOS~TSOUeO]fOagObgOl^Oo[OsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#_YO#aUO#bXO#duO#euO#hVO#i`O#raO~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT#yZU#yZ]#yZa#yZb#yZ!P#yZ!Q#yZ!R#yZ!T#yZ!V#yZ!^#yZ!c#yZ!f#yZ!h#yZ!j#yZ!k#yZ!n#yZ!p#yZ!r#yZ!s#yZ!t#yZ!v#yZ!x#yZ!y#yZ!z#yZ!{#yZ!}#yZ#O#yZ#P#yZ#_#yZ#a#yZ#b#yZ#d#yZ#e#yZ#h#yZ#i#yZ#r#yZ$U#yZ~TSOUeO]fOagObgOl^Oo[OsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#_YO#a!VO#bXO#duO#euO#hVO#i`O#raO~$a!XOT$`PU$`PX$`P]$`Pa$`Pb$`Pg$`Pi$`Pk$`Pl$`Pm$`Po$`Ps$`Pt$`Pu$`Pv$`Pw$`Py$`P!P$`P!Q$`P!R$`P!T$`P!V$`P!^$`P!b$`P!c$`P!f$`P!h$`P!j$`P!k$`P!n$`P!p$`P!r$`P!s$`P!t$`P!v$`P!x$`P!y$`P!z$`P!{$`P!}$`P#O$`P#P$`P#_$`P#a$`P#b$`P#d$`P#e$`P#h$`P#i$`P#r$`P$U$`P$Z$`Pq$`P$]$`P^$`P#x$`PZ$`P_$`Pe$`P~o}O~TSOt![O!PVO!QVO!TVO#aUO#bXO#duO#euO#hVO~TSOUeO]fOagObgOl^Oo[OsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#_YO#aUO#bXO#duO#euO#hVO#i`O#raO!c$nP~T!eO#b!eO#v!iO#x$qP~T!kO~T!oO~i!rO~!g!sO~!i!sO~!l!sO!m!sO~!o!sO~!q!sO~!l!sO~z!sO~!u!sO~!w!sO~z!tO~z!uO~#Q!sO#R!sO~o!vO~T!{O~T#OOUeO]fOagObgOl^Oo[Oq#SOsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#W#UO#Y#VO#]#VO#_YO#aUO#bXO#duO#euO#hVO#i`O#raO~TSOUeO]fOagObgOl^Oo#[OsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#_YO#aUO#bXO#duO#euO#hVO#i`O#raO~z#^O~o}Oy!TO!b|O$a{OTraUraXra]raarabragrairakralramrasratrauravrawra!Pra!Qra!Rra!Tra!Vra!^ra!cra!fra!hra!jra!kra!nra!pra!rra!sra!tra!vra!xra!yra!zra!{ra!}ra#Ora#Pra#_ra#ara#bra#dra#era#hra#ira#rra$Uraqra$]ra^ra#xraZra$Zra_raera~T#`XT#`aU#`XU#`aX#`XX#`a]#`X]#`aa#`Xa#`ab#`Xb#`ag#`Xg#`ai#`Xi#`ak#`Xk#`al#`Xl#`am#`Xm#`ao#`Xo#`as#`Xs#`at#`Xt#`au#`Xu#`av#`Xv#`aw#`Xw#`ay#`Xy#`a!P#`X!P#`a!Q#`X!Q#`a!R#`X!R#`a!T#`X!T#`a!V#`X!V#`a!^#`X!^#`a!b#`X!b#`a!c#`X!c#`a!f#`X!f#`a!h#`X!h#`a!j#`X!j#`a!k#`X!k#`a!n#`X!n#`a!p#`X!p#`a!r#`X!r#`a!s#`X!s#`a!t#`X!t#`a!v#`X!v#`a!x#`X!x#`a!y#`X!y#`a!z#`X!z#`a!{#`X!{#`a!}#`X!}#`a#O#`X#O#`a#P#`X#P#`a#_#`X#_#`a#a#`X#a#`a#b#`X#b#`a#d#`X#d#`a#e#`X#e#`a#h#`X#h#`a#i#`X#i#`a#r#`X#r#`a$U#`X$U#`a$a#`X$a#`aq#`Xq#`a$Z#`a$]#`X$]#`a^#`X^#`a#x#`X#x#`aZ#`XZ#`a$Z#`X_#`X_#`ae#`Xe#`a~$a!XOT$`XU$`XX$`X]$`Xa$`Xb$`Xg$`Xi$`Xk$`Xl$`Xm$`Xo$`Xs$`Xt$`Xu$`Xv$`Xw$`Xy$`X!P$`X!Q$`X!R$`X!T$`X!V$`X!^$`X!b$`X!c$`X!f$`X!h$`X!j$`X!k$`X!n$`X!p$`X!r$`X!s$`X!t$`X!v$`X!x$`X!y$`X!z$`X!{$`X!}$`X#O$`X#P$`X#_$`X#a$`X#b$`X#d$`X#e$`X#h$`X#i$`X#r$`X$U$`X$Z$`Xq$`X$]$`X^$`X#x$`XZ$`X_$`Xe$`X~T#`O~#a#aO~$Z#bO~X!SOg!POi!QOkwOlwOm!ROo}Oq#cOsxOtxOuyOvyOwzOy!TO!b|O$a{O~X$jXg$jXi$jXk$jXl$jXm$jXo$jXq$jXs$jXt$jXu$jXv$jXw$jXy$jX!b$jX$Z$lX$a$jX!c$jX$]$jX~X$YXg$YXi$YXk$YXl$YXm$YXo$YXq$YXs$YXt$YXu$YXv$YXw$YXy$YX!b$YX$Z$lX$a$YX!c$YX$]$YX~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$]#eO$a{O!c$iP~!c#gO~$b#hO~$]#jO#x$rP~#x#lO~#w#mO~X#nO~$]#pOZ$[P~Z#rO~X!SO^#sOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{O~X#tO~$]#vOe$^P~e#xO~!S#yO~!|#zO!}#zO~!|#zO~T#PO#W#UO#Y#VO#]#VOq$oP~o}OsxOtxOuyOvyOwzOy!TO!b|O$a{OTjiUjiXji]jiajibjigjiijikjiljimji!Pji!Qji!Rji!Tji!Vji!^ji!cji!fji!hji!jji!kji!nji!pji!rji!sji!tji!vji!xji!yji!zji!{ji!}ji#Oji#Pji#_ji#aji#bji#dji#eji#hji#iji#rji$Ujiqji$]ji^ji#xjiZji$Zji_jieji~o}OuyOvyOwzOy!TO!b|O$a{OTriUriXri]riaribrigriirikrilrimrisritri!Pri!Qri!Rri!Tri!Vri!^ri!cri!fri!hri!jri!kri!nri!pri!rri!sri!tri!vri!xri!yri!zri!{ri!}ri#Ori#Pri#_ri#ari#bri#dri#eri#hri#iri#rri$Uriqri$]ri^ri#xriZri$Zri_rieri~o}OwzOy!TO!b|O$a{OTriUriXri]riaribrigriirikrilrimrisritriurivri!Pri!Qri!Rri!Tri!Vri!^ri!cri!fri!hri!jri!kri!nri!pri!rri!sri!tri!vri!xri!yri!zri!{ri!}ri#Ori#Pri#_ri#ari#bri#dri#eri#hri#iri#rri$Uriqri$]ri^ri#xriZri$Zri_rieri~o}Oy!TO!b|O$a{OTriUriXri]riaribrigriirikrilrimrisritriurivriwri!Pri!Qri!Rri!Tri!Vri!^ri!cri!fri!hri!jri!kri!nri!pri!rri!sri!tri!vri!xri!yri!zri!{ri!}ri#Ori#Pri#_ri#ari#bri#dri#eri#hri#iri#rri$Uriqri$]ri^ri#xriZri$Zri_rieri~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O!c$OO$a{O~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$]#eO$a{Oq$iP~$a!XOX$`Pg$`Pi$`Pk$`Pl$`Pm$`Po$`Pq$`Ps$`Pt$`Pu$`Pv$`Pw$`Py$`P!b$`P$]$`P$b#UX~$b$QO~q$RO~#X$SO~#Z$SO#[$SO~X!SOi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OTfiUfi]fiafibfigfi!Pfi!Qfi!Rfi!Tfi!Vfi!^fi!cfi!ffi!hfi!jfi!kfi!nfi!pfi!rfi!sfi!tfi!vfi!xfi!yfi!zfi!{fi!}fi#Ofi#Pfi#_fi#afi#bfi#dfi#efi#hfi#ifi#rfi$Ufiqfi$]fi^fi#xfiZfi$Zfi_fiefi~X!SOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OThiUhi]hiahibhighiihi!Phi!Qhi!Rhi!Thi!Vhi!^hi!chi!fhi!hhi!jhi!khi!nhi!phi!rhi!shi!thi!vhi!xhi!yhi!zhi!{hi!}hi#Ohi#Phi#_hi#ahi#bhi#dhi#ehi#hhi#ihi#rhi$Uhiqhi$]hi^hi#xhiZhi$Zhi_hiehi~X!SOg!POi$TOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{O~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OTnXUnX]nXanXbnX!PnX!QnX!RnX!TnX!VnX!^nX!cnX!fnX!hnX!jnX!knX!nnX!pnX!rnX!snX!tnX!vnX!xnX!ynX!znX!{nX!}nX#OnX#PnX#_nX#anX#bnX#dnX#enX#hnX#inX#rnX$UnXqnX$]nX^nX#xnXZnX$ZnX_nXenX~TSO!O$ZO!R$[O!T$XO!V$]O!Z$^O!^$_O~$]#eO!c$iXq$iX~$]#jO#x$rX~T!eO#b!eO#v!iO~$]#pOZ$[X~$]#vOe$^X~!Q$qO~$b$rOq#oX$]#oX~$]$tOq$pP~q$vO~X!SOg!POi!QOkwOlwOm!ROo}Oq#cOsxOtxOuyOvyOwzOy!TO!b|O$a{O$]nX~$]$zOq$_P~q$|O~i$}O~i%OO~!W%PO~!W%QO~!W%RO~q%SO!b%SO!c%SO~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{O!c$Rc$]$Rcq$Rc~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{O#x#si$]#si~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$Z%TO$a{OZYX$]YX~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OTSqUSq]SqaSqbSq!PSq!QSq!RSq!TSq!VSq!^Sq!cSq!fSq!hSq!jSq!kSq!nSq!pSq!rSq!sSq!tSq!vSq!xSq!ySq!zSq!{Sq!}Sq#OSq#PSq#_Sq#aSq#bSq#dSq#eSq#hSq#iSq#rSq$USqqSq$]Sq^Sq#xSqZSq$ZSq_SqeSq~X!SO_%UOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT[qU[q][qa[qb[q!P[q!Q[q!R[q!T[q!V[q!^[q!c[q!f[q!h[q!j[q!k[q!n[q!p[q!r[q!s[q!t[q!v[q!x[q!y[q!z[q!{[q!}[q#O[q#P[q#_[q#a[q#b[q#d[q#e[q#h[q#i[q#r[q$U[qq[q$][q^[q#x[qZ[q$Z[qe[q~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{Oedi$]di~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT`qU`q]`qa`qb`q!P`q!Q`q!R`q!T`q!V`q!^`q!c`q!f`q!h`q!j`q!k`q!n`q!p`q!r`q!s`q!t`q!v`q!x`q!y`q!z`q!{`q!}`q#O`q#P`q#_`q#a`q#b`q#d`q#e`q#h`q#i`q#r`q$U`qq`q$]`q^`q#x`qZ`q$Z`q_`qe`q~$]$tOq$pX~T#PO#W#UO#Y#VO#]#VO~TSOUeO]fOagObgOl^Oo[OsQOtRO!PVO!QVO!RhO!TVO!VmO!^vO!b]O!cZO!fiO!hjO!jjO!kkO!nlO!plO!rnO!soO!tpO!vqO!xkO!yqO!zqO!{rO!}sO#OsO#PtO#_YO#aUO#bXO#duO#euO#hVO#i`O#p%ZO#raO~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$]%]O$a{Oq$hP~o}OsxOtxOuyOvyOwzOy!TO!b|O$a{OTjyUjyXjy]jyajybjygjyijykjyljymjy!Pjy!Qjy!Rjy!Tjy!Vjy!^jy!cjy!fjy!hjy!jjy!kjy!njy!pjy!rjy!sjy!tjy!vjy!xjy!yjy!zjy!{jy!}jy#Ojy#Pjy#_jy#ajy#bjy#djy#ejy#hjy#ijy#rjy$Ujyqjy$]jy^jy#xjyZjy$Zjy_jyejy~$]$zOq$_X~!P%aO~!S%aO~T%bO!O$ZO!R$[O!T$XO!V$]O!Z$^O!^$_O~T%dO~T%bO!O$ZO!R$[O!T$XO!V$]O!Z$^O!^$_O!X$dP~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT#nyU#ny]#nya#nyb#ny!P#ny!Q#ny!R#ny!T#ny!V#ny!^#ny!c#ny!f#ny!h#ny!j#ny!k#ny!n#ny!p#ny!r#ny!s#ny!t#ny!v#ny!x#ny!y#ny!z#ny!{#ny!}#ny#O#ny#P#ny#_#ny#a#ny#b#ny#d#ny#e#ny#h#ny#i#ny#r#ny$U#nyq#ny$]#ny^#ny#x#nyZ#ny$Z#ny_#nye#ny~$]%]Oq$hX~!Q%nO~$a!XO!X$`P$]$`P~!X%pO~$b%qO~$]%sO!X$cP~$]%vO!X$eP~!X%xO~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OZYi$]Yi~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT[!RU[!R][!Ra[!Rb[!R!P[!R!Q[!R!R[!R!T[!R!V[!R!^[!R!c[!R!f[!R!h[!R!j[!R!k[!R!n[!R!p[!R!r[!R!s[!R!t[!R!v[!R!x[!R!y[!R!z[!R!{[!R!}[!R#O[!R#P[!R#_[!R#a[!R#b[!R#d[!R#e[!R#h[!R#i[!R#r[!R$U[!Rq[!R$][!R^[!R#x[!RZ[!R$Z[!R_[!Re[!R~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{OT#n!RU#n!R]#n!Ra#n!Rb#n!R!P#n!R!Q#n!R!R#n!R!T#n!R!V#n!R!^#n!R!c#n!R!f#n!R!h#n!R!j#n!R!k#n!R!n#n!R!p#n!R!r#n!R!s#n!R!t#n!R!v#n!R!x#n!R!y#n!R!z#n!R!{#n!R!}#n!R#O#n!R#P#n!R#_#n!R#a#n!R#b#n!R#d#n!R#e#n!R#h#n!R#i#n!R#r#n!R$U#n!Rq#n!R$]#n!R^#n!R#x#n!RZ#n!R$Z#n!R_#n!Re#n!R~$b%yO~$a!XO!X$`X$]$`X~$]%sO!X$cX~!X&OO~$]%vO!X$eX~$f&RO~!X&TO~X!SOg!POi!QOkwOlwOm!ROo}OsxOtxOuyOvyOwzOy!TO!b|O$a{Oq$Qs$]$Qs~$f&VO~RQ#a$a!TvT~", | ||
goto: "4[$sPPPP$tPP%i%lP%rP$tPPP$tPP%u%xP$tP$tP$tPPP&OP&XP$tPPPPP$tPP&[&p'lPPPPPP'lPPP'lP'v'lP'|$t$tPP$t(SPPPPPPPPPPPPPPPPPPPPPPPPPPPP(w)m)p)zPPPPPP)mP*QPP*QPP*Q*xPP$t+p$t,e,e-YP,eP-`-f-jPPP-n-t-z.Q.W.c.i.o.u.|/SPPP/Y1ZP2OP2R2U2XPP2^2a2dP2g2j2m$t2s3o1Z3{4O4R4U4X!e`OQR[]dfwxyz|}!P!Q!R!S#[#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%yR!meQ!leR$j#pR$h#nR!qgQ!pgR$o#vQ#]!SQ$V#[R%`$zR$W#[Q$`#^Q%V$rQ%c%PS%f%R%vQ%{%qT&U&R&V!^`OQRdfwxyz|}!P!Q!R!S#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%yU!]Z^#bU!a[]#[a$Y#^$r%P%R%q%v&R&VQ%e%QR%}%sQ%g%RR&Q%v!eTOQR[]dfwxyz|}!P!Q!R!S#[#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%y!`!OPT!U!_!b!n!w!x!y!z!|!}#W#X#Y#Z$U$c$d$g$k$l$m$p$w$x%Y%i%j%k&SR!ZVR#T}Q#Q}S#{!v$tR%m%]X#P}!v$t%]!kXOQRZ[]^dfwxyz|}!P!Q!R!S#[#b#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%y!kWOQRZ[]^dfwxyz|}!P!Q!R!S#[#b#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%y!e_OQR[]dfwxyz|}!P!Q!R!S#[#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%y!ebOQR[]dfwxyz|}!P!Q!R!S#[#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%yQ#|!vR%X$tQ!gaR$f#jT!fa#jT!ea#jQdOR!jdQ#o!lR$i#oQ#u!pR$n#uQ$y$VR%_$yS!WS#OS#_!W%oR%o%bQ%r%eR%|%rQ%u%gR&P%uQ%[$wR%l%[S#d!b!}R$b#dQ$s#|R%W$sQ#i!gR$e#iSPOdS!UQRQ!_[Q!b]Q!nfQ!wwQ!xxQ!yyQ!zzQ!||Q!}}Q#W!PQ#X!QQ#Y!RS#Z!S$zQ$U#[Q$c#eQ$d#hQ$g#nQ$k#rQ$l#sQ$m#tQ$p#xQ$w$QQ$x$TQ%Y$vQ%i%TQ%j%UQ%k%ZR&S%y!ecOQR[]dfwxyz|}!P!Q!R!S#[#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%yR#q!lR#w!pR${$VV!YS#O%bR%t%eR%h%RR%w%gR#R}R%^$wQ#f!bR$P!}!^YOQRdfwxyz|}!P!Q!R!S#e#h#n#r#s#t#x$Q$T$v$z%T%U%Z%yU!]Z^#bV!`[]#[W!^Z[]#[Q!d^R$a#bR!c]R#}!vR$u#|R!haR#k!g", | ||
nodeNames: "⚠ Expressions LineComment BlockComment ForExpression Name for InExpressions InExpression in IterationContext return IfExpression if then else QuantifiedExpression some every InExpressions InExpression satisfies Disjunction or Conjunction and Comparison CompareOp CompareOp between PositiveUnaryTest ( PositiveUnaryTests ) ArithmeticExpression ArithOp ArithOp ArithOp ArithOp ArithOp InstanceOf instance of Type QualifiedName SpecialType days time duration years months DateAndTime ListType list < > ContextType context ContextEntryType FunctionType function ArgumentType PathExpression FilterExpression [ ] FunctionInvocation SpecialFunctionName string length upper case lower substring before after starts with ends contains insert index distinct values met by overlaps finished started day year week month get value entries Parameters NamedParameters ParameterName SpecialParameterName start position decimal sep separator grouping PositionalParameters null NumericLiteral Number StringLiteral BooleanLiteral true false DateTimeLiteral DateTimeConstructor date ? SimplePositiveUnaryTest Interval ParenthesizedExpression List FunctionDefinition FormalParameter external Context { ContextEntry Key SpecialKey method signature }", | ||
nodeProps: [ | ||
[NodeProp.top, 1,true], | ||
[NodeProp.skipped, 2,"true",3,"true"] | ||
], | ||
repeatNodeCount: 11, | ||
tokenData: "5X~R}XY$OY^$Opq$Oqr$srs%Otu%rxy(Wyz(]z{(b{|(o|}(t}!O(y!O!P)W!P!Q)p!Q![*{![!]+f!^!_+k!_!`$y!`!a+z!a!b%r!c!}%r!}#O,U#P#Q,Z#Q#R(j#R#S%r#T#W%r#W#X,`#X#o%r#o#p4w#q#r4|#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I`$Ib%r$I|$JO$O$JT$JU$O$KV$KW$O$Kh%#t%r&/x&Et%r&FU&FV$O&FV;'S%r;'S;:j5R?&r?Ah%r?BY?Mn%r~$TY$W~X^$Opq$O#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I|$JO$O$JT$JU$O$KV$KW$O&FU&FV$O~$vP!_!`$y~%OOk~~%TU#b~OY%OZr%Ors%gs#O%O#O#P%l#P~%O~%lO#b~~%oPO~%O~%w_T~tu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#o&v1p4U&v$I`$Ib&v$Je$Jg&v$Kh%#t&v&/x&Et&v&FV;'S&v;'S;:j(Q?&r?Ah&v?BY?Mn&v~&{_T~tu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#o&v1p4U&v$I`$Ib&v$Je$Jg&v$Kh%#t&v&/x&Et&v&FV;'S&v;'S;:j'z?&r?Ah&v?BY?Mn&v~'}P;=`<%l&v~(TP;=`<%l&v~(]Oo~~(bOq~~(gPu~z{(j~(oOw~~(tOs~~(yO$]~~)OPt~!`!a)R~)WO$f~~)]Q$a~!O!P)c!Q![)h~)hO$Z~~)mP#a~!Q![)h~)uQv~z{){!P!Q*p~*OROz){z{*X{~){~*[TOz){z{*X{!P){!P!Q*k!Q~){~*pOR~~*uQQ~OY*pZ~*p~+QQ#a~!O!P+W!Q![*{~+ZP!Q![+^~+cP#a~!Q![+^~+kO$b~R+rP!WQlP!_!`+uP+zOlPR,RP!XQlP!_!`+u~,ZO!b~~,`O!c~~,e`T~tu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#U-g#U#o&v1p4U&v$I`$Ib&v$Je$Jg&v$Kh%#t&v&/x&Et&v&FV;'S&v;'S;:j(Q?&r?Ah&v?BY?Mn&v~-laT~tu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#h&v#h#i.q#i#o&v1p4U&v$I`$Ib&v$Je$Jg&v$Kh%#t&v&/x&Et&v&FV;'S&v;'S;:j'z?&r?Ah&v?BY?Mn&v~.vaT~tu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#X&v#X#Y/{#Y#o&v1p4U&v$I`$Ib&v$Je$Jg&v$Kh%#t&v&/x&Et&v&FV;'S&v;'S;:j'z?&r?Ah&v?BY?Mn&v~0QjT~XY1rY^1rpq1rtu&v!Q![&v!a!b&v!c!}&v#R#S&v#T#o&v#y#z1r$f$g1r1p4U&v#BY#BZ1r$IS$I_1r$I`$Ib&v$I|$JO1r$JT$JU1r$Je$Jg&v$KV$KW1r$Kh%#t&v&/x&Et&v&FU&FV1r&FV;'S&v;'S;:j'z?&r?Ah&v?BY?Mn&v~1uZX^1rpq1r#T#U2h#y#z1r$f$g1r#BY#BZ1r$IS$I_1r$I|$JO1r$JT$JU1r$KV$KW1r&FU&FV1r~2kP#b#c2n~2qP#W#X2t~2wZXY3jY^3jpq3j#y#z3j$f$g3j#BY#BZ3j$IS$I_3j$I|$JO3j$JT$JU3j$KV$KW3j&FU&FV3j~3mZX^3jpq3j#h#i4`#y#z3j$f$g3j#BY#BZ3j$IS$I_3j$I|$JO3j$JT$JU3j$KV$KW3j&FU&FV3j~4cP#]#^4f~4iP#a#b4l~4oP#X#Y4r~4wO!T~~4|O#r~~5RO#x~~5UP;=`<%l%r", | ||
tokenizers: [0, 1], | ||
specializeTable: 5888, | ||
specializations: [{for:12, in:18, return:23, if:26, then:28, else:30, some:34, every:36, satisfies:43, or:46, and:50, between:58, instance:82, of:85, days:93, time:95, duration:97, years:99, months:101, list:107, context:115, function:120, string:137, length:139, upper:141, case:143, lower:145, substring:147, before:149, after:151, starts:153, with:155, ends:157, contains:159, insert:161, index:163, distinct:165, values:167, met:169, by:171, overlaps:173, finished:175, started:177, day:179, year:181, week:183, month:185, get:187, value:189, entries:191, start:201, position:203, decimal:205, sep:207, separator:209, grouping:211, null:214, true:224, false:226, date:233, "?":234, external:248, method:261, signature:263}], | ||
tokenPrec: 5882 | ||
}) | ||
/** | ||
* A feel parser for a specific grammar (unary tests / expressions) | ||
*/ | ||
export class Parser { | ||
constructor(grammarParser) { | ||
this._grammarParser = grammarParser; | ||
} | ||
parse(rawInput, rawContext) { | ||
const names = this._findNames(rawContext); | ||
const { | ||
context: parsedContext, | ||
input: parsedInput | ||
} = this._replaceNames(rawInput, rawContext, names); | ||
const tree = this._grammarParser.parse(parsedInput); | ||
return { | ||
parsedContext, | ||
parsedInput, | ||
tree | ||
}; | ||
} | ||
_parseName(name) { | ||
let match; | ||
const pattern = /([./\-'+*]+)|([^\s./\-'+*]+)/g; | ||
const tokens = []; | ||
let lastName = false; | ||
while ((match = pattern.exec(name))) { | ||
const [ _, additionalPart, namePart ] = match; | ||
if (additionalPart) { | ||
lastName = false; | ||
if (tokens.length) { | ||
tokens.push('\\s*'); | ||
} | ||
tokens.push(additionalPart.replace(/[+*]/g, '\\$&')); | ||
} else { | ||
if (tokens.length) { | ||
if (lastName) { | ||
tokens.push('\\s+'); | ||
} else { | ||
tokens.push('\\s*'); | ||
} | ||
} | ||
lastName = true; | ||
tokens.push(namePart); | ||
} | ||
} | ||
return tokens; | ||
} | ||
_findNames(context) { | ||
let uid = 0; | ||
return Object.keys(context).filter(key => /[\s./\-'+*]/.test(key)).map(name => { | ||
const replacement = '_' + uid.toString(36); | ||
const tokens = this._parseName(name); | ||
const replacer = new RegExp(tokens.join(''), 'g'); | ||
return { | ||
name, | ||
replacement, | ||
replacer | ||
}; | ||
}); | ||
} | ||
_replaceNames(input, context, names) { | ||
for (const { name, replacement, replacer } of names) { | ||
input = input.replace(replacer, function(match) { | ||
const placeholder = replacement.padEnd(match.length, '_'); | ||
if (!context[placeholder]) { | ||
context = { | ||
...context, | ||
[match]: context[name] | ||
}; | ||
} | ||
return placeholder; | ||
}); | ||
} | ||
return { | ||
input, | ||
context | ||
}; | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
597427
20
8380