Fix parser

This commit is contained in:
IRBorisov 2023-09-05 23:26:20 +03:00
parent 120cfdcf03
commit 3eada5b32d
4 changed files with 7 additions and 2 deletions

View File

@ -16,6 +16,8 @@ const testData = [
['1+2*5', '[Expression[BinaryOperation[BinaryOperation[Literal][+][Literal]][*][Literal]]]'],
['a1Z', '[Expression[BinaryOperation[Local[Index]][][Literal]]]'],
['Pr1(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'],
['Pr11(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'],
['Pr11,21(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'],
['pr1(S1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'],
['Pr1,2(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'],
['card(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'],
@ -36,6 +38,7 @@ const testData = [
describe('Testing RSParser', () => {
it.each(testData)('Parse %p',
(input: string, expectedTree: string) => {
// NOTE: use strict parser to determine exact error position
// const tree = parser.configure({strict: true}).parse(input);
const tree = parser.parse(input);
expect(printTree(tree)).toBe(expectedTree);

View File

@ -15,7 +15,7 @@ export const parser = LRParser.deserialize({
propSources: [highlighting],
skippedNodes: [0],
repeatNodeCount: 0,
tokenData: "4f~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q!R']!R!['e![!](Q!]!^(e!^!_(j!_!`(o!`!a(t!c!d(y!e!f(y!f!g)X!h!i)a!k!l)w!r!s)|!t!u*d!u!v(y!v!w(y!z!{(y!|!}*t!}#O*y#O#P+O#P#Q+T#R#S+Y#T#U+Y#U#V+e#V#W,w#W#X.W#X#d+Y#d#e0^#e#f+Y#f#g0|#g#o+Y#o#p1}#p#q2S#q#r2X#y#z%s$f$g%s$r$s2^%o%p2c5i6S+Y#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s% l% m2h%%Y%%Z2m%%[%%]2r%&Y%&Z2w%&]%&^2|%&_%&`3R%&`%&a3W%&b%&c3]%&c%&d3b%'S%'T3g%'T%'U3l%'U%'V3q%(^%(_3v%(b%(c3{%(c%(d4Q%)Q%)R4V%)S%)T4[%)U%)V4a&FU&FV%s~%xY!l~X^%spq%s#y#z%s$f$g%s#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s&FU&FV%s~&mO!h~~&rOa~~&wOb~~&|OZ~~'ROX~~'WO!w~~']OY~P'bP!pP!Q![']R'lQ!OQ!pP|}'r!Q![']Q'uP!R!['xQ'}P!OQ|}'r~(TQ!_!`(Z%&b%&c(`~(`Ot~~(eOr~~(jO!{~~(oO!W~~(tO!Z~~(yO!U~~(|P!Q![)P~)UPU~!Q![)P~)^Pk~!Q![)P~)dQ!Q![)j#]#^)r~)oPz~!Q![)j~)wO#S~~)|On~~*PQ!Q![*V#f#g*_~*[P!]~!Q![*V~*dO!|~~*iPv~!Q![*l~*qPV~!Q![*l~*yO!r~~+OO{~~+TO]~~+YOx~~+_Q!s~#T#o+Y5i6S+Y~+jS!s~#T#c+Y#c#d+v#d#o+Y5i6S+Y~+{S!s~#T#c+Y#c#d,X#d#o+Y5i6S+Y~,^S!s~#T#`+Y#`#a,j#a#o+Y5i6S+Y~,qQ#P~!s~#T#o+Y5i6S+Y~,|R!s~#T#U-V#U#o+Y5i6S+Y~-[S!s~#T#f+Y#f#g-h#g#o+Y5i6S+Y~-mS!s~#T#W+Y#W#X-y#X#o+Y5i6S+Y~.QQ#O~!s~#T#o+Y5i6S+Y~.]S!s~#T#X+Y#X#Y.i#Y#o+Y5i6S+Y~.nS!s~#T#U+Y#U#V.z#V#o+Y5i6S+Y~/PS!s~#T#c+Y#c#d/]#d#o+Y5i6S+Y~/bS!s~#T#c+Y#c#d/n#d#o+Y5i6S+Y~/sS!s~#T#`+Y#`#a0P#a#o+Y5i6S+Y~0WQ#Q~!s~#T#o+Y5i6S+Y~0cS!s~#T#f+Y#f#g0o#g#o+Y5i6S+Y~0vQ!}~!s~#T#o+Y5i6S+Y~1RS!s~#T#X+Y#X#Y1_#Y#o+Y5i6S+Y~1dS!s~#T#W+Y#W#X1p#X#o+Y5i6S+Y~1wQ#R~!s~#T#o+Y5i6S+Y~2SOd~~2XO!x~~2^Oc~~2cO!_~~2hO`~~2mOh~~2rO!f~~2wO!e~~2|O!a~~3RO!c~~3WO!q~~3]O^~~3bOj~~3gO!Q~~3lO!g~~3qO_~~3vO[~~3{O!Y~~4QO!X~~4VO!V~~4[O!T~~4aO!S~~4fO!R~",
tokenData: "4i~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q!R']!R!['e![!](T!]!^(h!^!_(m!_!`(r!`!a(w!c!d(|!e!f(|!f!g)[!h!i)d!k!l)z!r!s*P!t!u*g!u!v(|!v!w(|!z!{(|!|!}*w!}#O*|#O#P+R#P#Q+W#R#S+]#T#U+]#U#V+h#V#W,z#W#X.Z#X#d+]#d#e0a#e#f+]#f#g1P#g#o+]#o#p2Q#p#q2V#q#r2[#y#z%s$f$g%s$r$s2a%o%p2f5i6S+]#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s% l% m2k%%Y%%Z2p%%[%%]2u%&Y%&Z2z%&]%&^3P%&_%&`3U%&`%&a3Z%&b%&c3`%&c%&d3e%'S%'T3j%'T%'U3o%'U%'V3t%(^%(_3y%(b%(c4O%(c%(d4T%)Q%)R4Y%)S%)T4_%)U%)V4d&FU&FV%s~%xY!l~X^%spq%s#y#z%s$f$g%s#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s&FU&FV%s~&mO!h~~&rOa~~&wOb~~&|OZ~~'ROX~~'WO!w~~']OY~P'bP!pP!Q![']R'lQ!OQ!pP|}'r!Q!['eQ'uP!R!['xQ'}Q!OQ|}'r!Q!['x~(WQ!_!`(^%&b%&c(c~(cOt~~(hOr~~(mO!{~~(rO!W~~(wO!Z~~(|O!U~~)PP!Q![)S~)XPU~!Q![)S~)aPk~!Q![)S~)gQ!Q![)m#]#^)u~)rPz~!Q![)m~)zO#S~~*POn~~*SQ!Q![*Y#f#g*b~*_P!]~!Q![*Y~*gO!|~~*lPv~!Q![*o~*tPV~!Q![*o~*|O!r~~+RO{~~+WO]~~+]Ox~~+bQ!s~#T#o+]5i6S+]~+mS!s~#T#c+]#c#d+y#d#o+]5i6S+]~,OS!s~#T#c+]#c#d,[#d#o+]5i6S+]~,aS!s~#T#`+]#`#a,m#a#o+]5i6S+]~,tQ#P~!s~#T#o+]5i6S+]~-PR!s~#T#U-Y#U#o+]5i6S+]~-_S!s~#T#f+]#f#g-k#g#o+]5i6S+]~-pS!s~#T#W+]#W#X-|#X#o+]5i6S+]~.TQ#O~!s~#T#o+]5i6S+]~.`S!s~#T#X+]#X#Y.l#Y#o+]5i6S+]~.qS!s~#T#U+]#U#V.}#V#o+]5i6S+]~/SS!s~#T#c+]#c#d/`#d#o+]5i6S+]~/eS!s~#T#c+]#c#d/q#d#o+]5i6S+]~/vS!s~#T#`+]#`#a0S#a#o+]5i6S+]~0ZQ#Q~!s~#T#o+]5i6S+]~0fS!s~#T#f+]#f#g0r#g#o+]5i6S+]~0yQ!}~!s~#T#o+]5i6S+]~1US!s~#T#X+]#X#Y1b#Y#o+]5i6S+]~1gS!s~#T#W+]#W#X1s#X#o+]5i6S+]~1zQ#R~!s~#T#o+]5i6S+]~2VOd~~2[O!x~~2aOc~~2fO!_~~2kO`~~2pOh~~2uO!f~~2zO!e~~3PO!a~~3UO!c~~3ZO!q~~3`O^~~3eOj~~3jO!Q~~3oO!g~~3tO_~~3yO[~~4OO!Y~~4TO!X~~4YO!V~~4_O!T~~4dO!S~~4iO!R~",
tokenizers: [0, 1],
topRules: {"Expression":[0,1]},
tokenPrec: 1955

View File

@ -21,7 +21,7 @@
@tokens {
space { @whitespace+ }
ComplexIndex { $[1-9](","$[1-9])* }
ComplexIndex { $[1-9]$[0-9]*(","$[1-9]$[0-9]*)* }
integer { $[0-9]+ }
emptySet { "∅" }
integerSet { "Z" }

View File

@ -523,6 +523,8 @@ export function getRSErrorMessage(error: IRSErrorDescription): string {
return `Предупреждение! Повторное объявление локальной переменной ${error.params[0]}`;
case RSErrorType.localNotUsed:
return `Предупреждение! Переменная объявлена, но не использована: ${error.params[0]}`;
case RSErrorType.localUndeclared:
return `Использование необъявленной переменной: ${error.params[0]}`;
case RSErrorType.localShadowing:
return `Повторное объявление переменной: ${error.params[0]}`;