From 3eada5b32de3c1006a6800018e350da9476e2d1d Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Tue, 5 Sep 2023 23:26:20 +0300 Subject: [PATCH] Fix parser --- .../frontend/src/components/RSInput/rslang/parser.test.ts | 3 +++ rsconcept/frontend/src/components/RSInput/rslang/parser.ts | 2 +- .../frontend/src/components/RSInput/rslang/rslangFull.grammar | 2 +- rsconcept/frontend/src/utils/staticUI.ts | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts b/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts index bcc23344..65873971 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts +++ b/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts @@ -16,6 +16,8 @@ const testData = [ ['1+2*5', '[Expression[BinaryOperation[BinaryOperation[Literal][+][Literal]][*][Literal]]]'], ['a1∪Z', '[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); diff --git a/rsconcept/frontend/src/components/RSInput/rslang/parser.ts b/rsconcept/frontend/src/components/RSInput/rslang/parser.ts index 368c5665..e0c68630 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/parser.ts +++ b/rsconcept/frontend/src/components/RSInput/rslang/parser.ts @@ -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 diff --git a/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar b/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar index 725e8937..cdea5178 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar +++ b/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar @@ -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" } diff --git a/rsconcept/frontend/src/utils/staticUI.ts b/rsconcept/frontend/src/utils/staticUI.ts index 15e8536e..254bf19b 100644 --- a/rsconcept/frontend/src/utils/staticUI.ts +++ b/rsconcept/frontend/src/utils/staticUI.ts @@ -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]}`;