F: Add AST visualization for expression
Some checks are pending
Frontend CI / build (22.x) (push) Waiting to run

This commit is contained in:
Ivan 2024-09-26 23:10:01 +03:00
parent 7ab1eb71c1
commit 77be306cf1
13 changed files with 454 additions and 19 deletions

View File

@ -63,12 +63,12 @@ https://yandex.cloud/ru/docs/smartcaptcha
[Research]
Research and consider integration
- django-allauth - consider supporting popular auth providers
- drf-messages
- skeleton loading
https://react.dev/reference/react/Suspense
- backend error message unification
- drf-messages
https://drf-standardized-errors.readthedocs.io/en/latest/error_response.html
- semantic json diff

View File

@ -4,7 +4,7 @@
"version": "1.0.0",
"type": "module",
"scripts": {
"generate": "lezer-generator src/components/RSInput/rslang/rslangFull.grammar -o src/components/RSInput/rslang/parser.ts && lezer-generator src/components/RefsInput/parse/refsText.grammar -o src/components/RefsInput/parse/parser.ts",
"generate": "lezer-generator src/components/RSInput/rslang/rslangFast.grammar -o src/components/RSInput/rslang/parser.ts && lezer-generator src/components/RSInput/rslang/rslangAST.grammar -o src/components/RSInput/rslang/parserAST.ts && lezer-generator src/components/RefsInput/parse/refsText.grammar -o src/components/RefsInput/parse/parser.ts",
"test": "jest",
"dev": "vite --host",
"build": "tsc && vite build",

View File

@ -0,0 +1,46 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
export const
Expression = 1,
Logic = 2,
Logic_predicates = 3,
Variable = 4,
Local = 5,
Tuple = 8,
Setexpr_enum_min2 = 9,
Setexpr_enum = 10,
Setexpr = 11,
Literal = 12,
Integer = 13,
EmptySet = 14,
IntegerSet = 15,
Global = 16,
Radical = 17,
Setexpr_binary = 18,
Setexpr_generators = 27,
Enumeration = 30,
Boolean = 31,
Filter_expression = 33,
Filter = 34,
Declarative = 37,
PrefixD = 40,
PrefixI = 41,
Imperative = 42,
Imp_blocks = 43,
PrefixR = 45,
Recursion = 46,
Function = 48,
TextFunction = 49,
BigPr = 50,
SmallPr = 51,
Card = 52,
Bool = 53,
Debool = 54,
Red = 55,
Logic_unary = 68,
Predicate = 71,
Logic_quantor = 72,
Variable_pack = 74,
Logic_binary = 76,
Function_decl = 81,
Arguments = 82,
Declaration = 83

View File

@ -0,0 +1,20 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
import {LRParser} from "@lezer/lr"
export const parser = LRParser.deserialize({
version: 14,
states: "2xO!sQPOOOOQO'#Ch'#ChO#lQPO'#EWOOQO'#EW'#EWO%yQPO'#EVOVQPO'#CnO'_QPO'#CzO'fQPO'#C{O'nQPO'#C}O'sQPO'#DRO'xQPO'#DWO'}QPO'#D[OOQO'#Cw'#CwO(SQPO'#CwOOQO'#D_'#D_OOQO'#Cg'#CgO)pQPO'#CgO)uQPO'#CgO)zQPO'#C_OVQPO'#DsO*SQPO'#DvOOQO'#Dr'#DrO*[QPO'#DrO*aQPO'#EVOOQO'#C^'#C^O*rQPO'#EPQOQPOOO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,59YO*wQPO,58yO+OQPO'#CfO+VQPO,59YO,jQPO,59OO,rQPO'#CeO,wQPO,58xO-YQPO,59mO-{QPO'#CfO*wQPO'#CnO.YQPO,59fOOQO'#Cf'#CfO*wQPO,59gOOQO,59g,59gO*wQPO,59iO*SQPO,59mO*wQPO,59rO*SQPO,59vO*wQPO,59RO*wQPO,59RO$lQPO'#C_OOQO,5:_,5:_O*wQPO'#CdOOQO'#C`'#C`OOQO'#Dx'#DxO.bQPO,5:bO*wQPO,5:^OVQPO,5:fOVQPO,5:fOVQPO,5:fOVQPO,5:fO.jQPO'#EROOQO'#EQ'#EQO.oQPO,5:kOOQO1G.t1G.tO2`QPO1G.tO2gQPO1G.tO6VQPO1G.tO9uQPO1G.tO9|QPO1G.tO:TQPO1G.tO:[QPO1G.tO=vQPO1G.eOOQO1G.j1G.jO*wQPO,59POOQO1G.d1G.dO*wQPO1G/XOOQO1G/Q1G/QO>gQPO1G/RO>nQPO1G/TO>vQPO1G/XO>{QPO1G/^O?SQPO1G/bO?XQPO1G.mO?aQPO1G.mO*SQPO,5:dO*wQPO1G/|O?hQPO1G/xOOQO1G0Q1G0QO@[QPO1G0QO@cQPO1G0QO@jQPO1G0QO*wQPO,5:mO*rQPO,5:lOVQPO1G0VOAXQPO1G.kOAiQPO7+$sOOQO7+$m7+$mOApQPO7+$oO*wQPO7+$sOVQPO7+$xO*wQPO7+$|OOQO7+$X7+$XOOQO1G0O1G0OOAuQPO7+%hOOQO7+%d7+%dOBcQPO1G0XOOQO1G0W1G0WOOQO7+%q7+%qOVQPO<<H_O*wQPO<<HZOBmQPO<<H_OBtQPO'#DXOCYQPO<<HdOCbQPO<<HhOCiQPO<<ISODWQPOAN=yODiQPOAN=uOVQPOAN=yOVQPO,59sOOQOAN>OAN>OOVQPOAN>SOOQOG23eG23eOOQOG23aG23aODpQPOG23eOERQPO1G/_OEgQPOG23nOEnQPOG23nOOQOLD)PLD)POOQOLD)YLD)YO*wQPOLD)YOFPQPO!$'LtOOQO!)9B`!)9B`",
stateData: "Fi~O!xOS~OTQOVTO]PO^PO_PO`ROaROmUOpVOrWOxXOyYO}ZO!Q`O!S^O!T^O!U^O!V^O!W^O!X^O!hcO!ifO!kdO!mdO~OsiO~PVOc!zXd!zXe!zXf!zXg!zXh!zXi!zXj!zX!Y!zXl!zX~Ov!zX!PSX!ZSX![!zX!]!zX!^!zX!_!zX!`!zX!a!zX!b!zX!c!zX!d!zX!e!zX!v!zX~P!zOckOdlOemOfnOgoOhpOiqOjrOvsO![sO!]sO!^sO!_sO!`sO!asO!bsO!csO!dsO!esO~O!v!yX~P$lOV{O]PO^PO_PO`ROaROmUOpVOrWOxXOyYO}ZO!Q`O!S^O!T^O!U^O!V^O!W^O!X^O~OTyO~P&QOV!OOpVO~Os!QO~Om!RO~Om!SO~Om!TO~OckXdkXekXfkXgkXhkXikXjkXvkX!PSX!ZSX![kX!]kX!^kX!_kX!`kX!akX!bkX!ckX!dkX!ekX!vkX!YkXlkX~Os!UO~OV!VO~O!PsO!ZsO~OT!ZOV!YO~Os!^O~O!o!_O!p!`O!q!aO!r!bO!v!yX~OT!cO~OTRO~P&QO!YYX~P$lOU!fOcZXdZXeZXfZXgZXhZXiZXjZXvZX!YZX![ZX!]ZX!^ZX!_ZX!`ZX!aZX!bZX!cZX!dZX!eZX~OU!oO!YYX~O!Y!pO~OU!qO!o!_O!p!`O!q!aO!r!bO~Ov!rO~P!zOckOdlOemOfnOgoOhpOiqOjrO~OlYX!YYXtYX~P-aOl!sO!Y!pO~Ov!|O!Y!{O~Ov#SO~Ot#UO!Y#TO~OckOebifbigbihbiibijbivbi![bi!]bi!^bi!_bi!`bi!abi!bbi!cbi!dbi!ebi!vbiUbi!Ybilbi!obi!pbi!qbi!rbitbiwbiTbiVbi]bi^bi_bi`biabimbipbirbixbiybi}bi!Qbi!Sbi!Tbi!Ubi!Vbi!Wbi!Xbi!hbi!ibi!kbi!mbi|bi~Odbi~P.wOdlO~P.wOckOdlOemOjrOgbihbiibivbi![bi!]bi!^bi!_bi!`bi!abi!bbi!cbi!dbi!ebi!vbiUbi!Ybilbi!obi!pbi!qbi!rbitbiwbiTbiVbi]bi^bi_bi`biabimbipbirbixbiybi}bi!Qbi!Sbi!Tbi!Ubi!Vbi!Wbi!Xbi!hbi!ibi!kbi!mbi|bi~Ofbi~P2nOckOdlOemOfnOiqOjrOhbivbi![bi!]bi!^bi!_bi!`bi!abi!bbi!cbi!dbi!ebi!vbiUbi!Ybilbi!obi!pbi!qbi!rbitbiwbiTbiVbi]bi^bi_bi`biabimbipbirbixbiybi}bi!Qbi!Sbi!Tbi!Ubi!Vbi!Wbi!Xbi!hbi!ibi!kbi!mbi|bi~Ogbi~P6^OgoO~P6^OfnO~P2nOckOdlOemOfbigbihbiibijbivbi![bi!]bi!^bi!_bi!`bi!abi!bbi!cbi!dbi!ebi!vbiUbi!Ybilbi!obi!pbi!qbi!rbitbiwbiTbiVbi]bi^bi_bi`biabimbipbirbixbiybi}bi!Qbi!Sbi!Tbi!Ubi!Vbi!Wbi!Xbi!hbi!ibi!kbi!mbi|bi~O!oRi!pRi!qRi!rRi!vRiURilRi|RiwRi~P-aOU#XO~P-aOt#YO!Y!pO~Ov#ZO~Ow#[O~P-aO!P#]O~Ot#^O!Y!pO~OU#^O~P-aOt#aO!Y!pO~O!o!_O!q!ni!r!ni!v!niU!nil!ni|!niw!ni~O!p!ni~P?pO!p!`O~P?pO!o!_O!p!`O!q!aO!r!ni!v!niU!nil!ni|!niw!ni~OUXi!YXilXitXi~P-aOw#eO~P-aOV#fO~OckOdlOemOfnOgoOhpOiqOjrO~PVOt!ui!Y!ui~P-aOw#nO~P-aO!o!_O!p!`O!q!aO!r!bOl{X|{X~Ol#pO|#oO~Ow#qO~P-aO!o!_O!p!`O!q!aO!r!bO!v!jyU!jyl!jy|!jyw!jy~Ol#rO!o!_O!p!`O!q!aO!r!bO~OU#sO~P-aOl#xO!o!_O!p!`O!q!aO!r!bO~O!o!_O!p!`O!q!aO!r!bOl{i|{i~Ol#yO~P$lOw#zO!o!_O!p!`O!q!aO!r!bO~Ol#|O~P-aOr!S!i!Q`a!U!V!W!X!TT}yxy~",
goto: "-}!{PP!|#v$WPPP$t%x&T&f(dPPPPP)`PPPPPPPP(dPP*^+YP*^PPP*^PPPP*^,XPP*^PP,[PPPPPPPPPPPPPPPPPP#v-WPP-WP-hP#vPPPP-k-n-qPPP-w(dSgO#UQxTQ!XcQ#O!_Q#P!`Q#Q!aQ#R!bQ#h#[Q#k#`Q#l#eQ#t#nQ#u#oR#w#qmhOTc!_!`!a!b#U#[#`#e#n#o#qlbOTc!_!`!a!b#U#[#`#e#n#o#qQ![dQ!v!RQ!x!TR#_!{!U[Uklmnopqrs{!O!Q!S!U!V!Y!^!p!r!|#S#Z#]#f#zl]OTc!_!`!a!b#U#[#`#e#n#o#qX!Zd!R!T!{UvT{!YX}U!Q!U!^UwT{!YQ|UQ!u!QQ!y!UR!}!^SSO#UQtT[zU{!Q!U!Y!^d!Wc!_!`!a!b#[#`#e#n#oQ!fkQ!glQ!hmQ!inQ!joQ!kpQ!lqQ!mrQ!nsQ!t!OQ!w!SQ!z!VQ#V!pQ#W!rQ#`!|Q#b#SQ#g#ZQ#j#]Q#m#fQ#v#qR#{#z!s_OTUcklmnopqrs{!O!Q!S!U!V!Y!^!_!`!a!b!p!r!|#S#U#Z#[#]#`#e#f#n#o#q#z!n_OUcklmnopqrs!O!Q!S!U!V!Y!^!_!`!a!b!p!r!|#S#U#Z#[#]#`#e#f#n#o#q#zTuT{!s[OTUcklmnopqrs{!O!Q!S!U!V!Y!^!_!`!a!b!p!r!|#S#U#Z#[#]#`#e#f#n#o#q#z!r[OTUcklmnopqrs{!O!Q!S!U!V!Y!^!_!`!a!b!p!r!|#S#U#Z#[#]#`#e#f#n#o#q#zR!PVR#i#[!saOTUcklmnopqrs{!O!Q!S!U!V!Y!^!_!`!a!b!p!r!|#S#U#Z#[#]#`#e#f#n#o#q#zmeOTc!_!`!a!b#U#[#`#e#n#o#qR!]dRjOR!eiQ!diR#c#TQjOR#d#U",
nodeNames: "⚠ Expression Logic Logic_predicates Variable Local ) ( Tuple Setexpr_enum_min2 Setexpr_enum Setexpr Literal Integer EmptySet IntegerSet Global Radical Setexpr_binary + - * \\ ∆ ∩ × Setexpr_generators } { Enumeration Boolean Filter_expression Filter [ ] Declarative ∈ | PrefixD PrefixI Imperative Imp_blocks ; PrefixR Recursion := Function TextFunction BigPr SmallPr Card Bool Debool Red , :∈ ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = Logic_unary Negation ¬ Predicate Logic_quantor ∀ Variable_pack ∃ Logic_binary ⇔ ⇒ & Function_decl Arguments Declaration",
maxTerm: 88,
nodeProps: [
["openedBy", 6,"(",28,"{"],
["closedBy", 7,")",29,"}"]
],
skippedNodes: [0],
repeatNodeCount: 0,
tokenData: "6g~R!iX^%ppq%pvw&exy&jyz&oz{&t{|&y|}'O}!O'T!Q!['Y![!]'b!]!^'u!^!_'z!_!`(P!`!a(U!c!d(Z!e!f(Z!f!g(i!h!i(q!k!l)e!r!s)j!t!u*^!u!v(Z!v!w(Z!z!{(Z!|!}*n!}#O*s#O#P*x#P#Q*}#R#S+S#T#U+S#U#V+j#V#W-Y#W#X.u#X#d+S#d#e1_#e#f+S#f#g2t#g#o+S#o#p4O#p#q4T#q#r4Y#y#z%p$f$g%p$r$s4_%o%p4d5i6S+S#BY#BZ%p$IS$I_%p$I|$JO%p$JT$JU%p$KV$KW%p% l% m4i%%Y%%Z4n%%[%%]4s%&Y%&Z4x%&]%&^4}%&_%&`5S%&`%&a5X%&b%&c5^%&c%&d5c%'S%'T5h%'T%'U5m%'U%'V5r%(^%(_5w%(b%(c5|%(c%(d6R%)Q%)R6W%)S%)T6]%)U%)V6b&FU&FV%p~%uY!x~X^%ppq%p#y#z%p$f$g%p#BY#BZ%p$IS$I_%p$I|$JO%p$JT$JU%p$KV$KW%p&FU&FV%p~&jO!r~~&oOV~~&tOU~~&yOe~~'OOc~~'TO!Y~~'YOd~~'_P]~!Q!['Y~'eQ!_!`'k%&b%&c'p~'pO!P~~'uO!Z~~'zO|~~(PO!b~~(UO!e~~(ZO!`~~(^P!Q![(a~(fP`~!Q![(a~(nPx~!Q![(a~(tQ!Q![(z#]#^)S~)PP!Q~!Q![(z~)VP!R![)Y~)_Qr~|})S!Q![)Y~)jOy~~)mQ!Q![)s#f#g){~)xP!i~!Q![)s~*OP!R![*R~*WQ!S~|}){!Q![*R~*cP}~!Q![*f~*kPa~!Q![*f~*sO_~~*xOs~~*}Og~~+SOt~~+XRT~!Q![+b#T#o+S5i6S+S~+gPT~!Q![+b~+oTT~!Q![+b#T#c+S#c#d,O#d#o+S5i6S+S~,TTT~!Q![+b#T#c+S#c#d,d#d#o+S5i6S+S~,iTT~!Q![+b#T#`+S#`#a,x#a#o+S5i6S+S~-PR!V~T~!Q![+b#T#o+S5i6S+S~-_ST~!Q![+b#T#U-k#U#o+S5i6S+S~-pTT~!Q![+b#T#f+S#f#g.P#g#o+S5i6S+S~.UTT~!Q![+b#T#W+S#W#X.e#X#o+S5i6S+S~.lR!U~T~!Q![+b#T#o+S5i6S+S~.zTT~!Q![+b#T#X+S#X#Y/Z#Y#o+S5i6S+S~/`TT~!Q![+b#T#U+S#U#V/o#V#o+S5i6S+S~/tTT~!Q![+b#T#c+S#c#d0T#d#o+S5i6S+S~0YTT~!Q![+b#T#c+S#c#d0i#d#o+S5i6S+S~0nTT~!Q![+b#T#`+S#`#a0}#a#o+S5i6S+S~1UR!W~T~!Q![+b#T#o+S5i6S+S~1dTT~!Q![+b#T#f+S#f#g1s#g#o+S5i6S+S~1xST~!Q!R+b!R![2U#T#o+S5i6S+S~2]Q!T~T~|}2c!Q![2U~2fP!R![2i~2nQ!T~|}2c!Q![2i~2yTT~!Q![+b#T#X+S#X#Y3Y#Y#o+S5i6S+S~3_TT~!Q![+b#T#W+S#W#X3n#X#o+S5i6S+S~3uR!X~T~!Q![+b#T#o+S5i6S+S~4TOm~~4YOw~~4_Ol~~4dO!h~~4iOj~~4nOp~~4sO!p~~4xO!o~~4}O!k~~5SO!m~~5XO^~~5^Oh~~5cOv~~5hO![~~5mO!q~~5rOi~~5wOf~~5|O!d~~6RO!c~~6WO!a~~6]O!_~~6bO!^~~6gO!]~",
tokenizers: [0],
topRules: {"Expression":[0,1]},
tokenPrec: 1710
})

View File

@ -0,0 +1,247 @@
///////////////////////////////////////////////////////////
// ------------- Generator Definitions --------------------
///////////////////////////////////////////////////////////
@detectDelim
///////////////////////////////////////////////////////////
// ------------- Precedence Definitions --------------------
///////////////////////////////////////////////////////////
@precedence {
plus @left minus @left,
times @left,
not @right,
log_equiv @left,
log_impl @left,
log_or @left,
log_and @left,
set_decart @left set_union @left set_intersect @left set_minus @left set_symminus @left,
set_bool @right,
quant @right
}
///////////////////////////////////////////////////////////
// ------------- Terminal Tokens --------------------------
///////////////////////////////////////////////////////////
@tokens {
space { @whitespace+ }
Integer { $[0-9]+ }
EmptySet { "∅" }
IntegerSet { "Z" }
BigPr { "Pr"$[1-9]$[0-9]*(","$[1-9]$[0-9]*)* }
SmallPr { "pr"$[1-9]$[0-9]*(","$[1-9]$[0-9]*)* }
Filter { "Fi"$[1-9]$[0-9]*(","$[1-9]$[0-9]*)* }
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α-ω])*$[0-9]* }
PrefixR { "R" }
PrefixI { "I" }
PrefixD { "D" }
"¬"
"∀" "∃" "⇔" "⇒" "" "&"
""
"+" "-" "*" "" "\\" "∆" "∩" "×"
"∈" "∉" "⊆" "⊄" "⊂" ">" "≥" "≤" "<" "≠" "="
":∈" ":="
"," ";" "|"
"[" "]"
"{" "}"
"(" ")"
@precedence {
Filter
BigPr
Predicate
Function
Global
Radical
PrefixR
PrefixI
PrefixD
}
@precedence {
Card
Bool
Debool
Red
SmallPr
Local
}
}
@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
}
Variable {
Local |
Tuple
}
Variable_pack {
Variable |
Variable_pack "," Variable
}
// ------------------------- Logic Expressions --------------------------------
Logic {
Logic_predicates |
Logic_unary |
Logic_binary |
"(" Logic ")"
}
Logic_predicates {
Variable ":∈" Setexpr |
Variable ":=" Setexpr |
Setexpr "∈" Setexpr |
Setexpr "∉" Setexpr |
Setexpr "⊆" Setexpr |
Setexpr "⊄" Setexpr |
Setexpr "⊂" Setexpr |
Setexpr ">" Setexpr |
Setexpr "≥" Setexpr |
Setexpr "<" Setexpr |
Setexpr "≤" Setexpr |
Setexpr "≠" Setexpr |
Setexpr "=" Setexpr
}
Logic_unary {
Negation { !not "¬" Logic } |
Predicate "[" Setexpr_enum "]" |
Logic_quantor
}
Logic_quantor {
"∀" Variable_pack "∈" Setexpr !quant Logic |
"∃" Variable_pack "∈" Setexpr !quant Logic
}
Logic_binary {
Logic !log_equiv "⇔" Logic |
Logic !log_impl "⇒" Logic |
Logic !log_or "" Logic |
Logic !log_and "&" Logic
}
// ------------------------- Set Expressions ----------------------------------
Setexpr {
Literal |
identifier |
Setexpr_binary |
Setexpr_generators |
Function "[" Setexpr_enum "]" |
TextFunction "(" Setexpr ")"
}
TextFunction {
BigPr |
SmallPr |
Card |
Bool |
Debool |
Red
}
Setexpr_enum {
Setexpr |
Setexpr_enum_min2
}
Setexpr_enum_min2 {
Setexpr_enum "," Setexpr
}
Literal {
Integer |
EmptySet |
IntegerSet
}
identifier {
Local |
Global |
Radical
}
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 ")"
}
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 "[" Setexpr_enum "]" "(" Setexpr ")"
}
Declarative {
"{" Local "∈" Setexpr "|" Logic "}" |
PrefixD "{" Variable "∈" Setexpr "|" Logic "}"
}
Recursion {
PrefixR "{" Variable ":=" Setexpr ("|" Logic)? "|" Setexpr "}"
}
Imperative {
PrefixI "{" Setexpr "|" Imp_blocks "}"
}
Imp_blocks {
Logic |
Imp_blocks ";" Logic
}

View File

@ -6,7 +6,9 @@ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
import { toast } from 'react-toastify';
import BadgeHelp from '@/components/info/BadgeHelp';
import { CProps } from '@/components/props';
import RSInput from '@/components/RSInput';
import { parser as rslangParser } from '@/components/RSInput/rslang/parserAST';
import { RSTextWrapper } from '@/components/RSInput/textEditing';
import Overlay from '@/components/ui/Overlay';
import { useRSForm } from '@/context/RSFormContext';
@ -18,6 +20,7 @@ import { ConstituentaID, IConstituenta } from '@/models/rsform';
import { getDefinitionPrefix } from '@/models/rsformAPI';
import { IExpressionParse, IRSErrorDescription, SyntaxTree } from '@/models/rslang';
import { TokenID } from '@/models/rslang';
import { transformAST } from '@/utils/codemirror';
import { storage } from '@/utils/constants';
import { errors, labelTypification } from '@/utils/labels';
@ -124,17 +127,25 @@ function EditorRSExpression({
setIsModified(true);
}, []);
function handleShowAST() {
handleCheckExpression(parse => {
if (!parse.astText) {
toast.error(errors.astFailed);
} else {
setSyntaxTree(parse.ast);
// TODO: return prefix from parser API instead of prefixLength
setExpression(getDefinitionPrefix(activeCst) + value);
setShowAST(true);
}
});
function handleShowAST(event: CProps.EventMouse) {
if (event.ctrlKey) {
const tree = rslangParser.parse(value);
const ast = transformAST(tree);
setSyntaxTree(ast);
setExpression(value);
setShowAST(true);
} else {
handleCheckExpression(parse => {
if (!parse.astText) {
toast.error(errors.astFailed);
} else {
setSyntaxTree(parse.ast);
// TODO: return prefix from parser API instead of prefixLength
setExpression(getDefinitionPrefix(activeCst) + value);
setShowAST(true);
}
});
}
}
const controls = useMemo(

View File

@ -1,4 +1,5 @@
import { IconControls, IconTree } from '@/components/Icons';
import { CProps } from '@/components/props';
import MiniButton from '@/components/ui/MiniButton';
import Overlay from '@/components/ui/Overlay';
import { useRSForm } from '@/context/RSFormContext';
@ -8,7 +9,7 @@ interface ToolbarRSExpressionProps {
showControls: boolean;
toggleControls: () => void;
showAST: () => void;
showAST: (event: CProps.EventMouse) => void;
}
function ToolbarRSExpression({ disabled, showControls, toggleControls, showAST }: ToolbarRSExpressionProps) {

View File

@ -6,6 +6,7 @@ import { GramData, Grammeme, NounGrams, PartOfSpeech, VerbGrams } from '@/models
import { GraphColoring } from '@/models/miscellaneous';
import { CstClass, ExpressionStatus, IConstituenta } from '@/models/rsform';
import { ISyntaxTreeNode, TokenID } from '@/models/rslang';
import { PARAMETER } from '@/utils/constants';
/**
* Represents application color theme configuration.
@ -375,8 +376,65 @@ export function colorBgSyntaxTree(node: ISyntaxTreeNode, colors: IColorTheme): s
case TokenID.ITERATE:
return colors.bgRed;
}
switch (node.data.value) {
case 'Expression':
case 'Local':
return colors.bgGreen;
case 'Global':
case 'Radical':
case 'Function':
case 'Predicate':
case 'Literal':
case 'Integer':
case 'EmptySet':
case 'IntegerSet':
return colors.bgTeal;
case 'Logic':
case 'Logic_predicates':
case 'Variable':
case 'Tuple':
case 'Setexpr_enum_min2':
case 'Setexpr_enum':
case 'Setexpr':
case 'Setexpr_binary':
case 'Setexpr_generators':
case 'Enumeration':
case 'Boolean':
case 'Filter_expression':
case 'Filter':
case 'Declarative':
case 'Imperative':
case 'Imp_blocks':
case 'Recursion':
case 'TextFunction':
case 'Logic_unary':
case 'Logic_quantor':
case 'Variable_pack':
case 'Logic_binary':
case 'Function_decl':
case 'Arguments':
case 'Declaration':
return colors.bgBlue;
case 'BigPr':
case 'SmallPr':
case 'Card':
case 'Bool':
case 'Debool':
case 'Red':
case 'PrefixD':
case 'PrefixI':
case 'PrefixR':
return colors.bgPurple;
case PARAMETER.errorNodeLabel:
return colors.bgRed;
}
// node
return colors.bgRed;
return colors.bgPurple;
}
/**

View File

@ -13,8 +13,10 @@ import { IEntityReference, ISyntacticReference } from '@/models/language';
import { parseEntityReference, parseGrammemes, parseSyntacticReference } from '@/models/languageAPI';
import { IConstituenta } from '@/models/rsform';
import { isBasicConcept } from '@/models/rsformAPI';
import { SyntaxTree } from '@/models/rslang';
import { colorFgGrammeme, IColorTheme } from '../styling/color';
import { PARAMETER } from './constants';
import { describeConstituentaTerm, labelCstTypification, labelGrammeme } from './labels';
/**
@ -91,6 +93,56 @@ export function printTree(tree: Tree): string {
return state.output;
}
/**
* Transform Tree to {@link SyntaxTree}.
*/
export function transformAST(tree: Tree): SyntaxTree {
const result: SyntaxTree = [];
const parents: number[] = [];
const cursor = tree.cursor();
let finished = false;
let leave = true;
while (!finished) {
let node = cursorNode(cursor);
node.isLeaf = !cursor.firstChild();
leave = true;
result.push({
uid: result.length,
parent: parents.length > 0 ? parents[parents.length - 1] : result.length,
typeID: node.type.id,
start: node.from,
finish: node.to,
data: {
dataType: 'string',
value: node.type.name == '⚠' ? PARAMETER.errorNodeLabel : node.type.name
}
});
parents.push(result.length - 1);
if (!node.isLeaf) continue;
for (;;) {
node = cursorNode(cursor, node.isLeaf);
if (leave) {
parents.pop();
}
leave = cursor.type.isAnonymous;
node.isLeaf = false;
if (cursor.nextSibling()) {
break;
}
if (!cursor.parent()) {
finished = true;
break;
}
leave = true;
}
}
return result;
}
/**
* Retrieves a list of all nodes, containing given range and corresponding to a filter.
*/

View File

@ -34,6 +34,7 @@ export const PARAMETER = {
statSmallThreshold: 3, // characters - threshold for small labels - small font
logicLabel: 'LOGIC',
errorNodeLabel: '[ERROR]',
exteorVersion: '4.9.5',
TOOLTIP_WIDTH: 'max-w-[29rem]'

View File

@ -622,6 +622,9 @@ export function labelSyntaxTree(node: ISyntaxTreeNode): string {
return labelToken(node.typeID);
}
// node
if (node.data.value) {
return node.data.value as string;
}
return 'UNKNOWN ' + String(node.typeID);
}

View File

@ -3,10 +3,6 @@
$container= Read-Host -Prompt "Enter backend container name: "
function PopulateDevData() {
ImportInitialData
}
function ImportInitialData() {
docker exec `
-it $container `
python3.12 manage.py loaddata ./fixtures/InitialData.json