diff --git a/.vscode/settings.json b/.vscode/settings.json index 0e407911..e6796bdb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -105,6 +105,7 @@ "rsgraph", "rslang", "rstemplates", + "setexpr", "SIDELIST", "signup", "Slng", diff --git a/README.md b/README.md index 65314e44..894be6ad 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ This is the build for local Development - copy import wheels from ConceptCore to rsconcept/backend/import - run rsconcept/backend/LocalEnvSetup.ps1 - use VSCode configs in root folder to start development +- use 'npm run prepare' to regenerate frontend parsers (if you change grammar files) ## 🔭 Local docker build diff --git a/rsconcept/frontend/src/components/RSInput/rslang/parser.terms.ts b/rsconcept/frontend/src/components/RSInput/rslang/parser.terms.ts index 28fa00d2..3ad8777c 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/parser.terms.ts +++ b/rsconcept/frontend/src/components/RSInput/rslang/parser.terms.ts @@ -1,36 +1,16 @@ // This file was generated by lezer-generator. You probably shouldn't edit it. export const Expression = 1, - LogicPredicate = 2, - Literal = 3, - Local = 4, - Index = 5, - Global = 6, - Radical = 7, - BinaryOperation = 8, - Enumeration = 21, - Tuple = 22, - Boolean = 23, - Declarative = 25, - PrefixD = 28, - Variable = 29, - VariableComposite = 30, - PrefixI = 31, - Imperative = 32, - ImperativeBlocks = 33, - ImperativeIteration = 34, - ImperativeAssignment = 36, - ImperativeCondition = 38, - PrefixR = 40, - Recursion = 41, - FunctionCall = 43, - Function = 44, - TextFunctionExpression = 46, - TextFunction = 47, - ComplexIndex = 48, - Filter = 49, - Predicate = 61, - LogicQuantor = 64, - QuantorVariable = 66, - LogicBinary = 68, - FunctionDeclaration = 73 + Literal = 2, + Local = 3, + Index = 4, + Global = 5, + Radical = 6, + Filter = 20, + ComplexIndex = 21, + PrefixD = 26, + PrefixI = 27, + PrefixR = 31, + Function = 32, + TextFunction = 33, + Predicate = 45 diff --git a/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts b/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts index 6e9b8826..c49808c6 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts +++ b/rsconcept/frontend/src/components/RSInput/rslang/parser.test.ts @@ -8,37 +8,45 @@ const testData = [ ['∅', '[Expression[Literal]]'], ['Z', '[Expression[Literal]]'], ['1', '[Expression[Literal]]'], - ['12<41', '[Expression[LogicPredicate[Literal][<][Literal]]]'], - ['12=41', '[Expression[LogicPredicate[Literal][=][Literal]]]'], - ['ξ=ξ', '[Expression[LogicPredicate[Local][=][Local]]]'], - ['0-5', '[Expression[BinaryOperation[Literal][-][Literal]]]'], - ['¬2=2', '[Expression[LogicNegation[¬][LogicPredicate[Literal][=][Literal]]]]'], - ['12+41', '[Expression[BinaryOperation[Literal][+][Literal]]]'], - ['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][)]]]'], - ['red(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], - ['bool(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], - ['debool(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], - ['Fi1,2[ξ, ξ](ξ)', '[Expression[TextFunctionExpression[Filter[ComplexIndex]][[][Local][Local][]][(][Local][)]]]'], - ['ℬℬ(X1)', '[Expression[Boolean[ℬ][Boolean[ℬ][(][Global][)]]]]'], - ['P2[S1]', '[Expression[PredicateCall[Predicate][[][Global][]]]]'], - ['[σ∈R1×R1] F6[σ]', '[Expression[FunctionDeclaration[[][Local][∈][BinaryOperation[Radical][×][Radical]][]][FunctionCall[Function][[][Local][]]]]]'], - ['D{ξ∈red(S1) | ξ=ξ}', '[Expression[Declarative[PrefixD][{][Variable[Local]][∈][TextFunctionExpression[TextFunction][(][Global][)]][|][LogicPredicate[Local][=][Local]][}]]]'], - ['I{(σ, γ) | σ:∈X1; γ:=F1[σ]; P1[σ, γ]}', '[Expression[Imperative[PrefixI][{][Tuple[(][Local][Local][)]][|][ImperativeBlocks[ImperativeBlocks[ImperativeBlocks[ImperativeIteration[Local][:∈][Global]]][;][ImperativeAssignment[Local][:=][FunctionCall[Function][[][Local][]]]]][;][ImperativeCondition[PredicateCall[Predicate][[][Local][Local][]]]]][}]]]'], - ['R{ξ:=D1 | F1[ξ]≠∅ | ξ∪F1[ξ]}', '[Expression[Recursion[PrefixR][{][Variable[Local]][:=][Global][|][LogicPredicate[FunctionCall[Function][[][Local][]]][≠][Literal]][|][BinaryOperation[Local][∪][FunctionCall[Function][[][Local][]]]][}]]]'], - ['∀ξ∈∅ 1=1', '[Expression[LogicQuantor[∀][QuantorVariable[Variable[Local]]][∈][Literal][LogicPredicate[Literal][=][Literal]]]]'], - ['∀ξ1∈β (ξ1≠∅ & ∀ξ2∈β ξ1∩ξ2=∅)', '[Expression[LogicQuantor[∀][QuantorVariable[Variable[Local[Index]]]][∈][Local][(][LogicBinary[LogicPredicate[Local[Index]][≠][Literal]][&][LogicQuantor[∀][QuantorVariable[Variable[Local[Index]]]][∈][Local][LogicPredicate[BinaryOperation[Local[Index]][∩][Local[Index]]][=][Literal]]]][)]]]'] + ['12<41', '[Expression[Literal][<][Literal]]'], + ['12=41', '[Expression[Literal][=][Literal]]'], + ['ξ=ξ', '[Expression[Local][=][Local]]'], + ['0-5', '[Expression[Literal][-][Literal]]'], + ['¬2=2', '[Expression[¬][Literal][=][Literal]]'], + ['12+41', '[Expression[Literal][+][Literal]]'], + ['1+2*5', '[Expression[Literal][+][Literal][*][Literal]]'], + ['a1∪Z', '[Expression[Local[Index]][∪][Literal]]'], + ['Pr1(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'], + ['Pr11(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'], + ['Pr11,21(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'], + ['pr1(S1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'], + ['Pr1,2(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'], + ['card(X1)', '[Expression[TextFunction][(][Global][)]]'], + ['red(X1)', '[Expression[TextFunction][(][Global][)]]'], + ['bool(X1)', '[Expression[TextFunction][(][Global][)]]'], + ['debool(X1)', '[Expression[TextFunction][(][Global][)]]'], + ['Fi1,2[ξ, ξ](ξ)', '[Expression[Filter][ComplexIndex][[][Local][Local][]][(][Local][)]]'], + ['ℬℬ(X1)', '[Expression[ℬ][ℬ][(][Global][)]]'], + ['P2[S1]', '[Expression[Predicate][[][Global][]]]'], + ['[σ∈R1×R1] F6[σ]', '[Expression[[][Local][∈][Radical][×][Radical][]][Function][[][Local][]]]'], + ['D{ξ∈red(S1) | ξ=ξ}', '[Expression[PrefixD][{][Local][∈][TextFunction][(][Global][)][|][Local][=][Local][}]]'], + [ + 'I{(σ, γ) | σ:∈X1; γ:=F1[σ]; P1[σ, γ]}', + '[Expression[PrefixI][{][(][Local][Local][)][|][Local][:∈][Global][;][Local][:=][Function][[][Local][]][;][Predicate][[][Local][Local][]][}]]' + ], + [ + 'R{ξ:=D1 | F1[ξ]≠∅ | ξ∪F1[ξ]}', + '[Expression[PrefixR][{][Local][:=][Global][|][Function][[][Local][]][≠][Literal][|][Local][∪][Function][[][Local][]][}]]' + ], + ['∀ξ∈∅ 1=1', '[Expression[∀][Local][∈][Literal][Literal][=][Literal]]'], + [ + '∀ξ1∈β (ξ1≠∅ & ∀ξ2∈β ξ1∩ξ2=∅)', + '[Expression[∀][Local[Index]][∈][Local][(][Local[Index]][≠][Literal][&][∀][Local[Index]][∈][Local][Local[Index]][∩][Local[Index]][=][Literal][)]]' + ] ]; describe('Testing RSParser', () => { - it.each(testData)('Parse %p', - (input: string, expectedTree: string) => { + 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); diff --git a/rsconcept/frontend/src/components/RSInput/rslang/parser.ts b/rsconcept/frontend/src/components/RSInput/rslang/parser.ts index 2e1c1734..012a30f8 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/parser.ts +++ b/rsconcept/frontend/src/components/RSInput/rslang/parser.ts @@ -3,20 +3,16 @@ import {LRParser} from "@lezer/lr" import {highlighting} from "./highlight" export const parser = LRParser.deserialize({ version: 14, - states: "7WO!sQPOOOOQO'#C_'#C_O!zQPO'#C`O&bQPO'#D{OVQPO'#CdO&iQPO'#CqO'yQPO'#CsO(RQPO'#CuO(WQPO'#C|O(]QPO'#DVOOQO'#ES'#ESO(bQPO'#DXO(gQQO'#D]OOQO'#D]'#D]O(lQQO'#D_O(qQPO'#D[O(vQPO'#D[OOQO'#D}'#D}O({QPO'#DjOVQPO'#DlO)QQPO'#DnOOQO'#Ea'#EaO)YQPO'#D{OOQO'#D|'#D|O)TQPO'#DwQOQPOOOOQO'#Ca'#CaOOQO,58z,58zO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,58xO)kQPO'#ETO+PQPO,59OO+ZQPO'#EUO+`QPO,59^O+hQPO,5:}O,eQPO'#ETO&iQPO'#CdO,rQPO,59]OOQO'#ET'#ETO-fQPO,59aO&iQPO,59_OOQO,59_,59_O)QQPO,59aO&iQPO,59hO)QQPO,59qO&iQPO,59sOOQO,59w,59wOOQO,59y,59yO&iQPO,59vO&iQPO,59vO&iQPO,5:UO%TQPO'#C^OOQO,5:W,5:WOOQO'#Cy'#CyO)QQPO'#CyO-sQPO,5:YOOQO'#Dp'#DpOVQPO,5:^OVQPO,5:^OVQPO,5:^OVQPO,5:^O-{QPO'#EeOOQO'#Ed'#EdO.QQPO,5:cOOQO1G.j1G.jO0VQPO1G.jO0^QPO1G.jO2bQPO1G.jO4fQPO1G.jO4mQPO1G.jO4tQPO1G.jO5^QPO1G.jO7PQPO1G.dO&iQPO,5:pOOQO1G.x1G.xOOQO1G0i1G0iOOQO1G.w1G.wO&iQPO1G.{O7pQPO1G.yO7wQPO1G.{O7|QPO1G/SO8TQPO1G/]O8YQPO1G/_O8bQPO1G/bO8iQPO1G/bO8qQPO1G/pOOQO'#EW'#EWO8yQPO,59eO9RQPO'#CzO)QQPO,5:|O9WQPO1G/tOOQO1G/x1G/xO;SQPO1G/xO;ZQPO1G/xO;bQPO1G/xO&iQPO,5;PO)TQPO,5;OOVQPO1G/}O[QPO<dQPO<kQPO<SOOQOG23XG23XO?rQPOG23XO@TQPO1G/UO@_QPO1G/WOOQO1G/T1G/TO@iQPOG23iO@pQPOG23iOOQOG23nG23nOOQOLD(sLD(sOOQOLD)TLD)TO&iQPOLD)TOARQPO!$'LoOOQO!)9BZ!)9BZO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OOAYQPO1G.jOCRQPO1G.jOF}QPO1G.jOIXQPO1G.jOI`QPO1G.jOIgQPO1G.jOInQPO1G.j", - stateData: "Kx~O!nOS~OUaOVaOaSOdTOhUOlVOoWOxXO|ZO!_bO!acO!cdO!edO!rPO!sPO!tPO!uQO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~O}hO~PVO!rjOXSXYSXZSX[SX]SX^SX_SX`SXjSX!SSX!TSX!USX!VSX!WSX!XSX!YSX!ZSX![SX!]SX!lSX!ySXcSX!gSX!hSX!iSX!jSXbSXkSXuSXzSXsSXwSX~OXlOYmOZnO[oO]pO^qO_rO`sOjtO!StO!TtO!UtO!VtO!WtO!XtO!YtO!ZtO![tO!]tO~O!l!oX~P%TOUaOVaOa{OdTOhUOlVOoWOxXO|ZO!rPO!sPO!tPO!uQO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~Oa!POhUO~Od!RO~Od!SO~Od!TO~O}!UO~O!Q!VO~O!Q!WO~Oa!XO~O}!YO~O}!ZO~Oa!_O!uQO~O!g!bO!h!cO!i!dO!j!eO!l!oX~O!y!wX~P%TOX!qXY!qXZ!qX[!qX]!qX^!qX_!qX`!qXj!qX!S!qX!T!qX!U!qX!V!qX!W!qX!X!qX!Y!qX!Z!qX![!qX!]!qX~Ob!iO!y!qX~P)rO!y!rO~Ob!sO!y!wX~Ob!tO!g!bO!h!cO!i!dO!j!eO~OXlOYmOZnO[oO]pO^qO_rO`sO~Oc!wX!y!wXz!wX~P+yOc!uO!y!rO~OX!qXY!qXZ!qX[!qX]!qX^!qX_!qX`!qX~Oj!vOc!qX!y!qX~P,zOj#TO!y#SO~Oj#YO~Oz#[O!y#ZO~OXlOZWi[Wi]Wi^Wi_Wi`WijWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi![Wi!]Wi!lWibWi!yWicWi!gWi!hWi!iWi!jWikWizWiwWi~OYWi~P.YOYmO~P.YOXlOYmOZnO`sO]Wi^Wi_WijWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi![Wi!]Wi!lWibWi!yWicWi!gWi!hWi!iWi!jWikWizWiwWi~O[Wi~P0eOXlOYmOZnO[oO_rO`sO^WijWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi![Wi!]Wi!lWibWi!yWicWi!gWi!hWi!iWi!jWikWizWiwWi~O]Wi~P2iO]pO~P2iO[oO~P0eO[Wi]Wi^Wi_Wi`Wi~OXlOYmOZnOjWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi![Wi!]Wi!lWibWi!yWicWi!gWi!hWi!iWi!jWikWizWiwWi~P4{O!gQi!hQi!iQi!jQi!lQibQicQiwQikQi~P+yOb#_O~P+yOj#`O~Ok#aO~P+yOu#bO~Oz#cO!y!rO~Ob#dO~P+yOz#eO!y!rO~Oz#fO!y!rO~Ob#gO!y!zX~O!y#hO~OUaOVaOa{OdTOhUOlVOoWOxXO|ZO!rPO!sPO!tPO!u#jO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~O!g!bO!i!fi!j!fi!l!fib!fic!fiw!fik!fi~O!h!fi~P:hO!h!cO~P:hO!g!bO!h!cO!i!dO!j!fi!l!fib!fic!fiw!fik!fi~Ob!xi!y!xic!xiz!xi~P+yOk#oO~P+yOa#wO~OX$aOY$bOZ$cO[$dO]$eO^$fO_$gO`$hO~PVOz#Xi!y#Xi~P+yOk#{O~P+yOs#|Ou#}O~P)rO!g!bO!h!cO!i!dO!j!eOcvXwvX~Oc$POw$OO~Ok$QO~P+yO!g!bO!h!cO!i!dO!j!eO!l!byb!byc!byw!byk!by~Oc$SO!g!bO!h!cO!i!dO!j!eO~Ob$ZO~P+yOc$[O!g!bO!h!cO!i!dO!j!eO~Ocriwri~P+yOctiwti~P+yOc$]O~P%TOk$^O!g!bO!h!cO!i!dO!j!eO~Oc$`O~P+yOX$aOUWiVWiYWiZWiaWidWihWilWioWixWi|Wi!_Wi!aWi!cWi!eWi!rWi!sWi!tWi!uWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{OX$aOY$bOUWiVWiZWiaWidWihWilWioWixWi|Wi!_Wi!aWi!cWi!eWi!rWi!sWi!tWi!uWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{OX$aOY$bOZ$cO`$hOUWiVWi]Wi^Wi_WiaWidWihWilWioWixWi|Wi!_Wi!aWi!cWi!eWi!rWi!sWi!tWi!uWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~O[Wi~PDzOX$aOY$bOZ$cO[$dO_$gO`$hOUWiVWi^WiaWidWihWilWioWixWi|Wi!_Wi!aWi!cWi!eWi!rWi!sWi!tWi!uWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~O]Wi~PGUO]$eO~PGUO[$dO~PDzOX$aOY$bOZ$cOUWiVWiaWidWihWilWioWixWi|Wi!_Wi!aWi!cWi!eWi!rWi!sWi!tWi!uWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{O#S!|!_|UV#O#P#Q#R!}!uxolo~", - goto: "1f#YPP#Z#k$p&VPP&YPPPPPPPPPPPP'a'a(fP'aPPP)n*QP'a*T*WP*WP*WPP'aP#kPP#k*[P+aPPPPPPPPPP,fP,fP,fP,vP#ZPPPP,yPPP,|-S-zPPPP#k0e0uP1P1SPPPPPPP#Z1Y#Z1]1`mgOSc!b!c!d!e#[#a#k#o#{$O$Q#VaOSTclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$h#OaOSclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#b#k#o#w#{#|#}$Q$^$a$b$c$d$e$f$g$hQ!OT[!^d!R!T!_#S#hS!fh#ZT#q#a$ORkQ#QaOTclmnopqrst!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$hTvS{#VYOSTclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$h#UYOSTclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$hR!QUQ!adQ!x!RQ!z!TQ#P!_Q#i#SR#x#hR#Q!_R#u#aT#s#a$O#V_OSTclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$h#V`OSTclmnopqrst{!P!S!U!X!Y!Z!b!c!d!e!r!v#T#Y#[#`#a#b#k#o#w#{#|#}$O$Q$^$a$b$c$d$e$f$g$hmeOSc!b!c!d!e#[#a#k#o#{$O$QR!`dRiOQiOR#n#[SfO#[QySQ!]cQ#U!bQ#V!cQ#W!dQ#X!eS#r#a$OQ#y#kQ#z#oQ$T#{R$Y$QSRO#[QuSYzT{!U!Y!Zd![c!b!c!d!e#a#k#o#{$OS!il$aQ!jmQ!knQ!loQ!mpQ!nqQ!orQ!psQ!qtQ!w!PQ!y!SQ!|!XQ#]!rQ#^!vQ#k#TQ#l#YQ#p#`Q#v#bQ$R#wQ$U#|Q$V#}Q$X$QQ$_$^Q$i$bQ$j$cQ$k$dQ$l$eQ$m$fQ$n$gR$o$hSwS{Q|TQ!{!UQ!}!YR#O!ZSxS{X}T!U!Y!ZR#R!_Q#t#aR$W$OR!adR!hhQ!ghR#m#Z", - nodeNames: "⚠ Expression LogicPredicate Literal Local Index Global Radical BinaryOperation + - * ∪ \\ ∆ ∩ × ( ) } { Enumeration Tuple Boolean ℬ Declarative ∈ | PrefixD Variable VariableComposite PrefixI Imperative ImperativeBlocks ImperativeIteration :∈ ImperativeAssignment := ImperativeCondition ; PrefixR Recursion ] FunctionCall Function [ TextFunctionExpression TextFunction ComplexIndex Filter ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = PredicateCall Predicate LogicNegation ¬ LogicQuantor ∀ QuantorVariable ∃ LogicBinary ⇔ ⇒ ∨ & FunctionDeclaration", - maxTerm: 101, - nodeProps: [ - ["closedBy", 17,")",20,"}"], - ["openedBy", 18,"(",19,"{"] - ], + states: "6hO!sQPOOOOQO'#C^'#C^O!zQPO'#C_OOQO'#Dl'#DlO&bQPO'#DeOVQPO'#DnO&iQPO'#DpO'yQPO'#DuO(RQQO'#DvO(WQPO'#DwO(]QPO'#D{O(bQPO'#EOOOQO'#Do'#DoO(gQQO'#C}OOQO'#C}'#C}OOQO'#Dh'#DhO(lQPO'#DhO(qQPO'#DhOVQPO'#EVO(vQPO'#EVO({QPO'#EVO)TQPO'#DeOOQO'#Df'#DfO)OQPO'#EZQOQPOOOOQO'#C`'#C`OOQO,58y,58yO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:YO&iQPO,5:RO)fQPO'#DqO)mQPO,5:YO+QQPO'#DrO+VQPO,5:`O+_QPO,5:QO,[QPO,5:cO-TQPO'#DqO&iQPO'#DnO-bQPO,5:[OOQO'#Dq'#DqO&iQPO,5:aOOQO,5:a,5:aO-jQPO,5:bO({QPO,5:cO&iQPO,5:gO({QPO,5:jOOQO,59i,59iO&iQPO,5:SO&iQPO,5:SO%TQPO'#DgOOQO,5:q,5:qO&iQPO,5:qOOQO'#Dx'#DxO({QPO'#DxO-oQPO,5:qOOQO'#EW'#EWOVQPO,5:tOVQPO,5:tOVQPO,5:tOVQPO,5:tO-wQPO'#E]OOQO'#E['#E[O-|QPO,5:uOOQO1G/t1G/tO0RQPO1G/tO0YQPO1G/tO2^QPO1G/tO4bQPO1G/tO4iQPO1G/tO4pQPO1G/tO5YQPO1G/tO6{QPO1G/mO&iQPO,5:^OOQO1G/z1G/zOOQO1G/l1G/lO&iQPO1G/}OOQO1G/v1G/vO7lQPO1G/{O&iQPO1G/|O7sQPO1G/}O7xQPO1G0RO8PQPO1G0UO8UQPO1G/nO8^QPO1G/nO8eQPO1G0]OOQO'#Dz'#DzO8mQPO,5:dO8uQPO'#DyO({QPO,5:sO8zQPO1G0]OOQO1G0`1G0`O:vQPO1G0`O:}QPO1G0`O;UQPO1G0`O&iQPO,5:wO)OQPO,5:vOVQPO1G0aO;sQPO1G/xOeQPO'#D}OOQO'#D|'#D|O>yQPO<oO&iQPOAN>nOVQPOAN>oO&iQPO,5:iOVQPO,5:hOOQOAN>sAN>sOVQPOAN>vOOQOG24ZG24ZO@YQPOG24YO@aQPOG24ZO@rQPO1G0TOOQO1G0S1G0SO@|QPOG24bOATQPOG24bOOQOLD)tLD)tOOQOLD)uLD)uOOQOLD)|LD)|O&iQPOLD)|OAfQPO!$'MhOOQO!)9CS!)9CSO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YO8zQPO,5:YOAmQPO1G/tOCfQPO1G/tOGbQPO1G/tOIlQPO1G/tOIsQPO1G/tOIzQPO1G/tOJRQPO1G/t", + stateData: "L]~O!WOS~OTROURO_TOaUOcVOdWOjXOkYOoZOp`O|bO}cO!OdO!PdO!]PO!^PO!_PO!aQO!s]O!t]O!u^O!v^O!w^O!x^O~OfgO~PVO!]iOVRXWRXXRXYRXZRX[RX]RX^RXhRXrRXsRXtRXuRXvRXwRXxRXyRXzRX{RX!URX!gRXbRX!QRX!RRX!SRX!TRX`RXiRXmRXgRXlRXnRX~OVkOWlOXmOYnOZoO[pO]qO^rOhsOrsOssOtsOusOvsOwsOxsOysOzsO{sO~O!U!XX~P%TOTROURO_{OaUOcVOdWOjXOkYOoZOp`O!]PO!^PO!_PO!aQO!s]O!t]O!u^O!v^O!w^O!x^O~O_!OOcVO~Oe!QO~Oa!RO~Oa!SO~Oa!TO~Oe!UO~Of!VO~O_!WO~Of!ZO~O_!]O!aQO~O!Q!`O!R!aO!S!bO!T!cO!U!XX~O!g!eX~P%TO`!gOV![XW![XX![XY![XZ![X[![X]![X^![Xh![Xr![Xs![Xt![Xu![Xv![Xw![Xx![Xy![Xz![X{![X!g![X~O!g!pO~O`!qO!g!eX~O`!rO!Q!`O!R!aO!S!bO!T!cO~OV!`XW!`XX!`XY!`XZ!`X[!`X]!`X^!`X~Oh!sOb!`X!g!`X~P+pOVkOWlOXmOYnOZoO[pO]qO^rO~Ob!eX!g!eXg!eX~P,iOb!tO!g!pO~Of!vO~Oh#RO!g#QO~Oh#WO~Og#YO!g#XO~OVkOX!biY!biZ!bi[!bi]!bi^!bih!bir!bis!bit!biu!biv!biw!bix!biy!biz!bi{!bi!U!bi`!bi!g!bib!bi!Q!bi!R!bi!S!bi!T!bii!big!bin!bi~OW!bi~P.UOWlO~P.UOVkOWlOXmO^rOZ!bi[!bi]!bih!bir!bis!bit!biu!biv!biw!bix!biy!biz!bi{!bi!U!bi`!bi!g!bib!bi!Q!bi!R!bi!S!bi!T!bii!big!bin!bi~OY!bi~P0aOVkOWlOXmOYnO]qO^rO[!bih!bir!bis!bit!biu!biv!biw!bix!biy!biz!bi{!bi!U!bi`!bi!g!bib!bi!Q!bi!R!bi!S!bi!T!bii!big!bin!bi~OZ!bi~P2eOZoO~P2eOYnO~P0aOY!biZ!bi[!bi]!bi^!bi~OVkOWlOXmOh!bir!bis!bit!biu!biv!biw!bix!biy!biz!bi{!bi!U!bi`!bi!g!bib!bi!Q!bi!R!bi!S!bi!T!bii!big!bin!bi~P4wO!Q!Zi!R!Zi!S!Zi!T!Zi!U!Zi`!Zib!Zin!Zii!Zi~P,iO`#]O~P,iOh#_O~Oi#`O~P,iOm#aO~Og#bO!g!pO~O`#bO~P,iOg#cO!g!pO~O`#dO!g!nX~O!g#eO~OTROURO_{OaUOcVOdWOjXOkYOoZOp`O!]PO!^PO!_PO!a#gO!s]O!t]O!u^O!v^O!w^O!x^O~O!Q!`O!S!|i!T!|i!U!|i`!|ib!|in!|ii!|i~O!R!|i~P:[O!R!aO~P:[O!Q!`O!R!aO!S!bO!T!|i!U!|i`!|ib!|in!|ii!|i~O`!fi!g!fib!fig!fi~P,iOi#lO~P,iOg#mO!g!pO~OV$[OW$]OX$^OY$_OZ$`O[$aO]$bO^$cO~PVOg#Pi!g#Pi~P,iO_#wO~Oi#xO~P,iOl#yOm#yOh!`Xr!`Xs!`Xt!`Xu!`Xv!`Xw!`Xx!`Xy!`Xz!`X{!`X~P+pO!Q!`O!R!aO!S!bO!T!cOb!qXn!qX~Ob#{On#zO~Oi#|O~P,iO!Q!`O!R!aO!S!bO!T!cO!U!yy`!yyb!yyn!yyi!yy~Ob#}O!Q!`O!R!aO!S!bO!T!cO~O`$UO~P,iOb$VO!Q!`O!R!aO!S!bO!T!cO~Ob!qin!qi~P,iOb$WO~P%TOi$XO!Q!`O!R!aO!S!bO!T!cO~Ob$ZO~P,iOV$[OT!biU!biW!biX!bi_!bia!bic!bid!bij!bik!bio!bip!bi|!bi}!bi!O!bi!P!bi!]!bi!^!bi!_!bi!a!bi!s!bi!t!bi!u!bi!v!bi!w!bi!x!bi~P4wOV$[OW$]OT!biU!biX!bi_!bia!bic!bid!bij!bik!bio!bip!bi|!bi}!bi!O!bi!P!bi!]!bi!^!bi!_!bi!a!bi!s!bi!t!bi!u!bi!v!bi!w!bi!x!bi~P4wOV$[OW$]OX$^O^$cOT!biU!biZ!bi[!bi]!bi_!bia!bic!bid!bij!bik!bio!bip!bi|!bi}!bi!O!bi!P!bi!]!bi!^!bi!_!bi!a!bi!s!bi!t!bi!u!bi!v!bi!w!bi!x!bi~OY!bi~PE_OV$[OW$]OX$^OY$_O]$bO^$cOT!biU!bi[!bi_!bia!bic!bid!bij!bik!bio!bip!bi|!bi}!bi!O!bi!P!bi!]!bi!^!bi!_!bi!a!bi!s!bi!t!bi!u!bi!v!bi!w!bi!x!bi~OZ!bi~PGiOZ$`O~PGiOY$_O~PE_OV$[OW$]OX$^OT!biU!bi_!bia!bic!bid!bij!bik!bio!bip!bi|!bi}!bi!O!bi!P!bi!]!bi!^!bi!_!bi!a!bi!s!bi!t!bi!u!bi!v!bi!w!bi!x!bi~P4wOd!s}pTU!u!v!w!x!t!aokjk~", + goto: "/j#QPP#R$V%kPPPPPPPPPPPPPPPPPPPPPPPPPPPP%nPPPPPPPPPPPPPPPPPPPPP&r&x'p(QPPP#RP*h#R+n,r-SP+n-^+n+n.e.w.z+n.}/Q+nPPPPPP'p/W/Z'p/^/a/d#T_OTUbklmnopqrs{!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#`#a#h#l#w#x#y#z#|$X$[$]$^$_$`$a$b$c!|ROTbklmnopqrs{!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#a#h#l#w#x#y#|$X$[$]$^$_$`$a$b$cQyU[![d!R!T!]#Q#eS!dg#XT#o#`#zRjQ#TaOTUbklmnopqrs{!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#`#a#h#l#w#x#y#z#|$X$[$]$^$_$`$a$b$cQhOR#k#YSeO#YQxTQ!YbQ#S!`Q#T!aQ#U!bQ#V!cS#p#`#zQ#u#hQ#v#lQ$P#xR$T#|mfOTb!`!a!b!c#Y#`#h#l#x#z#|SSO#YQtTYzU{!V!Z!vd!Xb!`!a!b!c#`#h#l#x#zS!gk$[Q!hlQ!imQ!jnQ!koQ!lpQ!mqQ!nrQ!osQ!u!OQ!x!SQ!{!WQ#Z!pQ#[!sQ#h#RQ#i#WQ#n#_Q#s#aQ$O#wQ$Q#yQ$S#|Q$Y$XQ$d$]Q$e$^Q$f$_Q$g$`Q$h$aQ$i$bR$j$c#O_OUbklmnopqrs!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#`#a#h#l#w#x#y#z#|$X$[$]$^$_$`$a$b$cTuT{#T[OTUbklmnopqrs{!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#`#a#h#l#w#x#y#z#|$X$[$]$^$_$`$a$b$cSvT{Q|UQ!z!VQ!|!ZR#^!vSwT{X}U!V!Z!v#S[OTUbklmnopqrs{!O!S!V!W!Z!`!a!b!c!p!s!v#R#W#Y#_#`#a#h#l#w#x#y#z#|$X$[$]$^$_$`$a$b$cR!PVQ!_dQ!w!RQ!y!TQ!}!]Q#f#QR#t#eR#O!]R#P!]R#r#`Q#q#`R$R#zR!^dR!_dRhOR!fgQ!egR#j#X", + nodeNames: "⚠ Expression Literal Local Index Global Radical + - * ∪ \\ ∆ ∩ × ( ) { } ℬ Filter ComplexIndex [ ] ∈ | PrefixD PrefixI :∈ := ; PrefixR Function TextFunction ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = ¬ Predicate ∀ ∃ ⇔ ⇒ ∨ &", + maxTerm: 93, propSources: [highlighting], skippedNodes: [0], repeatNodeCount: 0, - 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!n~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!j~~&rOa~~&wOb~~&|OZ~~'ROX~~'WO!y~~']OY~P'bP!rP!Q![']R'lQ!QQ!rP|}'r!Q!['eQ'uP!R!['xQ'}Q!QQ|}'r!Q!['x~(WQ!_!`(^%&b%&c(c~(cOu~~(hOs~~(mOw~~(rO!Y~~(wO!]~~(|O!W~~)PP!Q![)S~)XPU~!Q![)S~)aPl~!Q![)S~)gQ!Q![)m#]#^)u~)rP|~!Q![)m~)zO#S~~*POo~~*SQ!Q![*Y#f#g*b~*_P!_~!Q![*Y~*gO!|~~*lPx~!Q![*o~*tPV~!Q![*o~*|O!t~~+RO}~~+WO]~~+]Oz~~+bQ!u~#T#o+]5i6S+]~+mS!u~#T#c+]#c#d+y#d#o+]5i6S+]~,OS!u~#T#c+]#c#d,[#d#o+]5i6S+]~,aS!u~#T#`+]#`#a,m#a#o+]5i6S+]~,tQ#P~!u~#T#o+]5i6S+]~-PR!u~#T#U-Y#U#o+]5i6S+]~-_S!u~#T#f+]#f#g-k#g#o+]5i6S+]~-pS!u~#T#W+]#W#X-|#X#o+]5i6S+]~.TQ#O~!u~#T#o+]5i6S+]~.`S!u~#T#X+]#X#Y.l#Y#o+]5i6S+]~.qS!u~#T#U+]#U#V.}#V#o+]5i6S+]~/SS!u~#T#c+]#c#d/`#d#o+]5i6S+]~/eS!u~#T#c+]#c#d/q#d#o+]5i6S+]~/vS!u~#T#`+]#`#a0S#a#o+]5i6S+]~0ZQ#Q~!u~#T#o+]5i6S+]~0fS!u~#T#f+]#f#g0r#g#o+]5i6S+]~0yQ!}~!u~#T#o+]5i6S+]~1US!u~#T#X+]#X#Y1b#Y#o+]5i6S+]~1gS!u~#T#W+]#W#X1s#X#o+]5i6S+]~1zQ#R~!u~#T#o+]5i6S+]~2VOd~~2[Ok~~2aOc~~2fO!a~~2kO`~~2pOh~~2uO!h~~2zO!g~~3PO!c~~3UO!e~~3ZO!s~~3`O^~~3eOj~~3jO!S~~3oO!i~~3tO_~~3yO[~~4OO![~~4TO!Z~~4YO!X~~4_O!V~~4dO!U~~4iO!T~", + 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!W~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!T~~&rO_~~&wO`~~&|OX~~'ROV~~'WO!g~~']OW~P'bP!]P!Q![']R'lQeQ!]P|}'r!Q!['eQ'uP!R!['xQ'}QeQ|}'r!Q!['x~(WQ!_!`(^%&b%&c(c~(cOm~~(hOl~~(mOn~~(rOx~~(wO{~~(|Ov~~)PP!Q![)S~)XPT~!Q![)S~)aPj~!Q![)S~)gQ!Q![)m#]#^)u~)rPp~!Q![)m~)zOd~~*POk~~*SQ!Q![*Y#f#g*b~*_P}~!Q![*Y~*gO!s~~*lPo~!Q![*o~*tPU~!Q![*o~*|O!_~~+ROf~~+WOZ~~+]Og~~+bQ!a~#T#o+]5i6S+]~+mS!a~#T#c+]#c#d+y#d#o+]5i6S+]~,OS!a~#T#c+]#c#d,[#d#o+]5i6S+]~,aS!a~#T#`+]#`#a,m#a#o+]5i6S+]~,tQ!v~!a~#T#o+]5i6S+]~-PR!a~#T#U-Y#U#o+]5i6S+]~-_S!a~#T#f+]#f#g-k#g#o+]5i6S+]~-pS!a~#T#W+]#W#X-|#X#o+]5i6S+]~.TQ!u~!a~#T#o+]5i6S+]~.`S!a~#T#X+]#X#Y.l#Y#o+]5i6S+]~.qS!a~#T#U+]#U#V.}#V#o+]5i6S+]~/SS!a~#T#c+]#c#d/`#d#o+]5i6S+]~/eS!a~#T#c+]#c#d/q#d#o+]5i6S+]~/vS!a~#T#`+]#`#a0S#a#o+]5i6S+]~0ZQ!w~!a~#T#o+]5i6S+]~0fS!a~#T#f+]#f#g0r#g#o+]5i6S+]~0yQ!t~!a~#T#o+]5i6S+]~1US!a~#T#X+]#X#Y1b#Y#o+]5i6S+]~1gS!a~#T#W+]#W#X1s#X#o+]5i6S+]~1zQ!x~!a~#T#o+]5i6S+]~2VOa~~2[Oi~~2aOb~~2fO|~~2kO^~~2pOc~~2uO!R~~2zO!Q~~3PO!O~~3UO!P~~3ZO!^~~3`O[~~3eOh~~3jOr~~3oO!S~~3tO]~~3yOY~~4OOz~~4TOy~~4YOw~~4_Ou~~4dOt~~4iOs~", tokenizers: [0, 1], topRules: {"Expression":[0,1]}, - tokenPrec: 1955 + tokenPrec: 1974 }) diff --git a/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar b/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar index cd2bb973..9d4ec469 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar +++ b/rsconcept/frontend/src/components/RSInput/rslang/rslangFull.grammar @@ -1,3 +1,12 @@ +/////////////////////////////////////////////////////////// +// ------------- Generator Definitions -------------------- +/////////////////////////////////////////////////////////// +@detectDelim +@external propSource highlighting from "./highlight" + +/////////////////////////////////////////////////////////// +// ------------- Precedence Definitions -------------------- +/////////////////////////////////////////////////////////// @precedence { plus @left minus @left, times @left, @@ -12,36 +21,32 @@ p1, p2 } -@top Expression { - term_or_logic | - FunctionDeclaration -} - -@skip { space } - +/////////////////////////////////////////////////////////// +// ------------- Terminal Tokens -------------------------- +/////////////////////////////////////////////////////////// @tokens { - space { @whitespace+ } - ComplexIndex { $[1-9]$[0-9]*(","$[1-9]$[0-9]*)* } - integer { $[0-9]+ } - emptySet { "∅" } - integerSet { "Z" } + space { @whitespace+ } + ComplexIndex { $[1-9]$[0-9]*(","$[1-9]$[0-9]*)* } + integer { $[0-9]+ } + emptySet { "∅" } + integerSet { "Z" } - bigPr { "Pr" } - smallPr { "pr" } - filter { "Fi" } - card { "card" } - bool { "bool" } - debool { "debool" } - red { "red" } + bigPr { "Pr" } + smallPr { "pr" } + Filter { "Fi" } + card { "card" } + bool { "bool" } + debool { "debool" } + red { "red" } - Global { $[XCSDAT]$[0-9]+ } - Function { "F"$[0-9]+ } - Predicate { "P"$[0-9]+ } - Radical { "R"$[0-9]+ } - local { $[_a-zα-ω]($[a-zα-ω])* } - PrefixR { "R" } - PrefixI { "I" } - PrefixD { "D" } + Global { $[XCSDAT]$[0-9]+ } + Function { "F"$[0-9]+ } + Predicate { "P"$[0-9]+ } + Radical { "R"$[0-9]+ } + local { $[_a-zα-ω]($[a-zα-ω])* } + PrefixR { "R" } + PrefixI { "I" } + PrefixD { "D" } "¬" "∀" "∃" "⇔" "⇒" "∨" "&" @@ -55,146 +60,207 @@ "{" "}" "(" ")" - @precedence { filter bigPr Predicate Function Global Radical PrefixR PrefixI PrefixD } - @precedence { card bool debool red smallPr local } + @precedence { + Filter + bigPr + Predicate + Function + Global + Radical + PrefixR + PrefixI + PrefixD + } + @precedence { + card + bool + debool + red + smallPr + local + } } -Index { integer } +@skip { space } + + +/////////////////////////////////////////////////////////////////////////////// +// ------------------------- Grammar Rules ------------------------------------ +/////////////////////////////////////////////////////////////////////////////// + +// ------------------------- Language Expression ------------------------------ +@top Expression { + logic_or_setexpr | + function_decl +} +logic_or_setexpr { + logic | + setexpr +} +function_decl { + "[" arguments "]" logic_or_setexpr +} + + +// ------------------------- Variables and arguments ------------------------- +arguments { + declaration | + arguments "," declaration +} +declaration { + Local "∈" setexpr +} Local { !p1 local | !p2 local Index } - -Literal { integer | emptySet | integerSet } - -TextFunction { - bigPr ComplexIndex | - smallPr ComplexIndex | - card | bool | debool | red +Index { + integer +} +variable { + Local | + "(" variableComposite ")" +} +variableComposite { + var_all "," variable +} +var_all { + variable | + variableComposite } -Filter { filter ComplexIndex } - -term_or_logic { logic | term } - -FunctionDeclaration { "[" arg_declaration "]" term_or_logic } -arg_declaration { - declaration | - arg_declaration "," declaration -} -declaration { Local "∈" term } +// ------------------------- Logic Expressions -------------------------------- logic { - LogicPredicate | - logicUnary | - LogicBinary | - logic_par -} -logic_par { "(" logic ")" } -logicUnary { - PredicateCall { Predicate "[" term_enum "]" } | - LogicNegation { !not "¬" logic } | - LogicQuantor -} -LogicQuantor { - "∀" QuantorVariable "∈" term !quant logic | - "∃" QuantorVariable "∈" term !quant logic + logic_predicates | + logic_unary | + logic_binary | + "(" logic ")" } -LogicPredicate { - term "∈" term | - term "∉" term | - term "⊆" term | - term "⊄" term | - term "⊂" term | - term ">" term | - term "≥" term | - term "<" term | - term "≤" term | - term "≠" term | - term "=" term +logic_predicates { + setexpr "∈" setexpr | + setexpr "∉" setexpr | + setexpr "⊆" setexpr | + setexpr "⊄" setexpr | + setexpr "⊂" setexpr | + setexpr ">" setexpr | + setexpr "≥" setexpr | + setexpr "<" setexpr | + setexpr "≤" setexpr | + setexpr "≠" setexpr | + setexpr "=" setexpr } -LogicBinary { +logic_unary { + !not "¬" logic | + Predicate "[" setexpr_enum "]" | + "∀" quant_var "∈" setexpr !quant logic | + "∃" quant_var "∈" setexpr !quant logic +} +quant_var { + variable | + quant_var_enum +} +quant_var_enum { + quant_var "," variable +} + +logic_binary { logic !log_equiv "⇔" logic | logic !log_impl "⇒" logic | logic !log_or "∨" logic | logic !log_and "&" logic } -QuantorVariable { Variable | quant_var_enum } -quant_var_enum { QuantorVariable "," Variable } -Variable { Local | "(" VariableComposite ")" } -VariableComposite { var_all "," Variable } -var_all { Variable | VariableComposite } -term { - Literal | Local | Global | Radical | - BinaryOperation | - typed_constructors | - FunctionCall | - TextFunctionExpression +// ------------------------- Set Expressions ---------------------------------- +setexpr { + Literal | + identifier | + setexpr_binary | + setexpr_generators | + Function "[" setexpr_enum "]" | + TextFunction "(" setexpr ")" } -FunctionCall { Function "[" term_enum "]" } - -TextFunctionExpression { - TextFunction "(" term ")" | - Filter "[" term_enum "]" "(" term ")" +TextFunction { + bigPr ComplexIndex | + smallPr ComplexIndex | + card | + bool | + debool | + red +} +setexpr_enum { + setexpr | + setexpr_enum_min2 +} +setexpr_enum_min2 { + setexpr_enum "," setexpr } -BinaryOperation { - term !plus "+" term | - term !minus "-" term | - term !times "*" term | - term !set_union "∪" term | - term !set_minus "\\" term | - term !set_symminus "∆" term | - term !set_intersect "∩" term | - term !set_decart "×" term | - "(" BinaryOperation ")" +Literal { + integer | + emptySet | + integerSet +} +identifier { + Local | + Global | + Radical } -typed_constructors { - Enumeration | - Tuple | - Boolean | - Declarative | - Imperative | - Recursion -} -Enumeration { "{" term_enum "}"} -Tuple { "(" term_enum_min2 ")"} -Boolean { - !set_bool "ℬ" "(" term ")" | - !set_bool "ℬ" Boolean +setexpr_binary { + setexpr !plus "+" setexpr | + setexpr !minus "-" setexpr | + setexpr !times "*" setexpr | + setexpr !set_union "∪" setexpr | + setexpr !set_minus "\\" setexpr | + setexpr !set_symminus "∆" setexpr | + setexpr !set_intersect "∩" setexpr | + setexpr !set_decart "×" setexpr | + "(" setexpr_binary ")" } -term_enum { term | term_enum_min2 } -term_enum_min2 { term_enum "," term } +setexpr_generators { + enumeration | + tuple | + boolean | + filter_expression | + declarative | + imperative | + recursion +} +enumeration { + "{" setexpr_enum "}" +} +tuple { + "(" setexpr_enum_min2 ")" +} +boolean { + !set_bool "ℬ" "(" setexpr ")" | + !set_bool "ℬ" boolean +} +filter_expression { + Filter ComplexIndex "[" setexpr_enum "]" "(" setexpr ")" +} -Declarative { - "{" Local "∈" term "|" logic "}" | - PrefixD "{" Variable "∈" term "|" logic "}" +declarative { + "{" Local "∈" setexpr "|" logic "}" | + PrefixD "{" variable "∈" setexpr "|" logic "}" } -Recursion { - PrefixR "{" Variable ":=" term ("|" logic)? "|" term "}" +recursion { + PrefixR "{" variable ":=" setexpr ("|" logic)? "|" setexpr "}" } -Imperative { - PrefixI "{" term "|" ImperativeBlocks "}" +imperative { + PrefixI "{" setexpr "|" imp_blocks "}" } -ImperativeBlocks { +imp_blocks { imp_block | - ImperativeBlocks ";" imp_block + imp_blocks ";" imp_block } imp_block { - ImperativeIteration | - ImperativeAssignment | - ImperativeCondition + Local ":∈" setexpr | + Local ":=" setexpr | + logic } -ImperativeIteration { Local ":∈" term } -ImperativeAssignment { Local ":=" term } -ImperativeCondition { logic } - -@detectDelim - -@external propSource highlighting from "./highlight" \ No newline at end of file diff --git a/rsconcept/frontend/src/components/RSInput/rslang/rslangLex.grammar b/rsconcept/frontend/src/components/RSInput/rslang/rslangLex.grammar index 03cb6735..197ac74a 100644 --- a/rsconcept/frontend/src/components/RSInput/rslang/rslangLex.grammar +++ b/rsconcept/frontend/src/components/RSInput/rslang/rslangLex.grammar @@ -1,44 +1,68 @@ +@detectDelim +@external propSource highlighting from "./highlight" + @top Expression { token* } @skip { space } @tokens { - space { @whitespace+ } - Index { $[0-9]+ } - ComplexIndex { $[1-9](","$[1-9])* } - Integer { space$[0-9]+space? } + space { @whitespace+ } + Index { $[0-9]+ } + ComplexIndex { $[1-9](","$[1-9])* } + Integer { space$[0-9]+space? } - bigPr { "Pr" } - smallPr { "pr" } - filter { "Fi" } - card { "card" } - bool { "bool" } - debool { "debool" } - red { "red" } + bigPr { "Pr" } + smallPr { "pr" } + filter { "Fi" } + card { "card" } + bool { "bool" } + debool { "debool" } + red { "red" } - ConstructPrefix { "D" | "R" | "I" } + ConstructPrefix { "D" | "R" | "I" } - Global { $[XCSDAPTF]$[0-9]+ } - Radical { "R"$[0-9]+ } - local { $[_a-zα-ω]$[a-zα-ω]* } + Global { $[XCSDAPTF]$[0-9]+ } + Radical { "R"$[0-9]+ } + local { $[_a-zα-ω]$[a-zα-ω]* } "(" ")" "[" "]" "{" "}" - @precedence { filter bigPr Global Radical ConstructPrefix } - @precedence { card bool debool red smallPr local } - @precedence { Integer space } + @precedence { + filter + bigPr + Global + Radical + ConstructPrefix + } + @precedence { + card + bool + debool + red + smallPr + local + } + @precedence { + Integer + space + } } TextFunction { bigPr ComplexIndex | smallPr ComplexIndex | filter ComplexIndex | - card | bool | debool | red + card | + bool | + debool | + red } -Local { local Index? } +Local { + local Index? +} token { TextFunction | @@ -47,8 +71,4 @@ token { Global | Radical | Local -} - -@detectDelim - -@external propSource highlighting from "./highlight" \ No newline at end of file +} \ No newline at end of file