mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Fix parser
This commit is contained in:
parent
a6b21279a9
commit
6a5a635829
|
@ -29,7 +29,8 @@ export const
|
||||||
TextFunction = 45,
|
TextFunction = 45,
|
||||||
ComplexIndex = 46,
|
ComplexIndex = 46,
|
||||||
Filter = 47,
|
Filter = 47,
|
||||||
Predicate = 58,
|
Predicate = 59,
|
||||||
QuantorVariable = 62,
|
LogicQuantor = 62,
|
||||||
LogicBinary = 63,
|
QuantorVariable = 64,
|
||||||
FunctionDeclaration = 68
|
LogicBinary = 66,
|
||||||
|
FunctionDeclaration = 71
|
||||||
|
|
|
@ -7,19 +7,36 @@ const testData = [
|
||||||
['∅', '[Expression[Literal]]'],
|
['∅', '[Expression[Literal]]'],
|
||||||
['Z', '[Expression[Literal]]'],
|
['Z', '[Expression[Literal]]'],
|
||||||
['1', '[Expression[Literal]]'],
|
['1', '[Expression[Literal]]'],
|
||||||
|
['12<41', '[Expression[LogicPredicate[Literal][<][Literal]]]'],
|
||||||
['12=41', '[Expression[LogicPredicate[Literal][=][Literal]]]'],
|
['12=41', '[Expression[LogicPredicate[Literal][=][Literal]]]'],
|
||||||
|
['ξ=ξ', '[Expression[LogicPredicate[Local][=][Local]]]'],
|
||||||
['0-5', '[Expression[BinaryOperation[Literal][-][Literal]]]'],
|
['0-5', '[Expression[BinaryOperation[Literal][-][Literal]]]'],
|
||||||
|
['¬2=2', '[Expression[LogicNegation[¬][LogicPredicate[Literal][=][Literal]]]]'],
|
||||||
['12+41', '[Expression[BinaryOperation[Literal][+][Literal]]]'],
|
['12+41', '[Expression[BinaryOperation[Literal][+][Literal]]]'],
|
||||||
|
['1+2*5', '[Expression[BinaryOperation[BinaryOperation[Literal][+][Literal]][*][Literal]]]'],
|
||||||
['a1∪Z', '[Expression[BinaryOperation[Local[Index]][∪][Literal]]]'],
|
['a1∪Z', '[Expression[BinaryOperation[Local[Index]][∪][Literal]]]'],
|
||||||
|
['Pr1(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][)]]]]'],
|
['ℬℬ(X1)', '[Expression[Boolean[ℬ][Boolean[ℬ][(][Global][)]]]]'],
|
||||||
['P2[S1]', '[Expression[PredicateCall[Predicate][[][Global][]]]]'],
|
['P2[S1]', '[Expression[PredicateCall[Predicate][[][Global][]]]]'],
|
||||||
['[σ∈R1×R1] F6[σ]', '[Expression[FunctionDeclaration[[][Local][∈][BinaryOperation[Radical][×][Radical]][]][FunctionCall[Function][[][Local][]]]]]'],
|
['[σ∈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]][}]]]'],
|
['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]]]][)]]]']
|
||||||
];
|
];
|
||||||
|
|
||||||
describe('Testing RSParser', () => {
|
describe('Testing RSParser', () => {
|
||||||
it.each(testData)('Parse %p',
|
it.each(testData)('Parse %p',
|
||||||
(input: string, expectedTree: string) => {
|
(input: string, expectedTree: string) => {
|
||||||
|
// const tree = parser.configure({strict: true}).parse(input);
|
||||||
const tree = parser.parse(input);
|
const tree = parser.parse(input);
|
||||||
expect(printTree(tree)).toBe(expectedTree);
|
expect(printTree(tree)).toBe(expectedTree);
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,10 +3,10 @@ import {LRParser} from "@lezer/lr"
|
||||||
import {highlighting} from "./highlight.ts"
|
import {highlighting} from "./highlight.ts"
|
||||||
export const parser = LRParser.deserialize({
|
export const parser = LRParser.deserialize({
|
||||||
version: 14,
|
version: 14,
|
||||||
states: "7|O!pQPOOOOQO'#C_'#C_O!wQPO'#C`O&bQPO'#DvOVQPO'#CdO&iQPO'#CqO'yQPO'#CsO(RQPO'#CuO(WQPO'#C{O(]QPO'#DTOOQO'#D}'#D}O(bQPO'#DVO(gQQO'#DZOOQO'#DZ'#DZO(lQQO'#D]O(qQPO'#DYO(vQPO'#DYOOQO'#Dx'#DxO({QPO'#DgO&iQPO'#DiO)QQPO'#DkOOQO'#E^'#E^O)YQPO'#EcOOQO'#Ec'#EcO)kQPOOOOQO'#Dw'#DwO)TQPO'#DrQOQPOOOOQO'#Ca'#CaOOQO,58z,58zO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,58xO)yQPO'#EOO+[QPO,59OO+fQPO'#EPO+kQPO,59^O+sQPO,5:zO,pQPO'#EOO&iQPO'#CdO,}QPO,59]OOQO'#EO'#EOO-qQPO,59aO&iQPO,59_OOQO,59_,59_O)QQPO,59aO&iQPO,59gO)QQPO,59oO&iQPO,59qOOQO,59u,59uOOQO,59w,59wO&iQPO,59tO&iQPO,59tO&iQPO,5:RO%WQPO'#C^O.OQPO'#E_OOQO,5:T,5:TOOQO'#Cx'#CxO)QQPO'#CxO.ZQPO,5:VOOQO'#Dl'#DlOVQPO,5:XOVQPO,5:XOVQPO,5:XOVQPO,5:XO.cQPO'#EeOOQO'#Ed'#EdO.hQPO,5:^OOQO1G.j1G.jO0sQPO1G.jO0zQPO1G.jO3UQPO1G.jO5`QPO1G.jO5gQPO1G.jO5nQPO1G.jO6WQPO1G.jO8PQPO1G.dO&iQPO,5:kOOQO1G.x1G.xOOQO1G0f1G0fOOQO1G.w1G.wO&iQPO1G.{O8yQPO1G.yO9QQPO1G.{O9VQPO1G/RO9^QPO1G/ZO9cQPO1G/]O9kQPO1G/`O9rQPO1G/`O9zQPO1G/mO:SQPO,5:yOOQO'#ES'#ESO:XQPO,59dO:aQPO'#CyO)QQPO,5:|O:fQPO1G/qOOQO1G/s1G/sO<bQPO1G/sO<iQPO1G/sO<pQPO1G/sO&iQPO,5;PO)TQPO,5;OOVQPO1G/xO=_QPO1G0VO=oQPO7+$gOOQO7+$e7+$eO&iQPO7+$gOVQPO7+$mO&iQPO7+$uOOQO7+$w7+$wOOQO7+$z7+$zO=vQPO7+$zOOQO7+%X7+%XOVQPO'#E`OOQO1G0e1G0eOOQO1G/O1G/OO)QQPO,59eOOQO1G0h1G0hOOQO'#C`'#C`O={QPO7+%]O>iQPO1G0kOOQO1G0j1G0jOOQO7+%d7+%dOVQPO<<HRO>sQPO<<HRO>zQPO'#DxO?UQPO'#DROOQO'#ET'#ETOOQO'#C|'#C|O?jQPO<<HXO?rQPO<<HaO&iQPO<<HfOOQO1G/P1G/POOQO<<Hw<<HwO?yQPOAN=mOVQPOAN=mO&iQPO,59iO&iQPO,59kOVQPO,59hOOQOAN=sAN=sOVQPOAN={O@[QPOAN>QOOQOG23XG23XO@cQPOG23XO@tQPO1G/TOAOQPO1G/VOOQO1G/S1G/SOAYQPOG23gOAaQPOG23gOOQOG23lG23lOOQOLD(sLD(sOOQOLD)RLD)RO&iQPOLD)ROArQPO!$'LmOOQO!)9BX!)9BXO:fQPO,59OO:fQPO,59OO:fQPO,59OO:fQPO,59OO:fQPO,59OO:fQPO,59OO:fQPO,59OO:fQPO,59OOAyQPO1G.jOCfQPO1G.jOFxQPO1G.jOHvQPO1G.jOH}QPO1G.jOIUQPO1G.jOI]QPO1G.j",
|
states: "7WO!sQPOOOOQO'#C_'#C_O!zQPO'#C`O&bQPO'#DyOVQPO'#CdO&iQPO'#CqO'yQPO'#CsO(RQPO'#CuO(WQPO'#C{O(]QPO'#DTOOQO'#EQ'#EQO(bQPO'#DVO(gQQO'#DZOOQO'#DZ'#DZO(lQQO'#D]O(qQPO'#DYO(vQPO'#DYOOQO'#D{'#D{O({QPO'#DhOVQPO'#DjO)QQPO'#DlOOQO'#Ea'#EaO)YQPO'#DyOOQO'#Dz'#DzO)TQPO'#DuQOQPOOOOQO'#Ca'#CaOOQO,58z,58zO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,59OO&iQPO,58xO)kQPO'#ERO+PQPO,59OO+ZQPO'#ESO+`QPO,59^O+hQPO,5:}O,eQPO'#ERO&iQPO'#CdO,rQPO,59]OOQO'#ER'#ERO-fQPO,59aO&iQPO,59_OOQO,59_,59_O)QQPO,59aO&iQPO,59gO)QQPO,59oO&iQPO,59qOOQO,59u,59uOOQO,59w,59wO&iQPO,59tO&iQPO,59tO&iQPO,5:SO%TQPO'#C^OOQO,5:U,5:UOOQO'#Cx'#CxO)QQPO'#CxO-sQPO,5:WOOQO'#Dn'#DnOVQPO,5:[OVQPO,5:[OVQPO,5:[OVQPO,5:[O-{QPO'#EeOOQO'#Ed'#EdO.QQPO,5:aOOQO1G.j1G.jO0VQPO1G.jO0^QPO1G.jO2bQPO1G.jO4fQPO1G.jO4mQPO1G.jO4tQPO1G.jO5^QPO1G.jO7PQPO1G.dO&iQPO,5:nOOQO1G.x1G.xOOQO1G0i1G0iOOQO1G.w1G.wO&iQPO1G.{O7pQPO1G.yO7wQPO1G.{O7|QPO1G/RO8TQPO1G/ZO8YQPO1G/]O8bQPO1G/`O8iQPO1G/`O8qQPO1G/nOOQO'#EV'#EVO8yQPO,59dO9RQPO'#CyO)QQPO,5:|O9WQPO1G/rOOQO1G/v1G/vO;SQPO1G/vO;ZQPO1G/vO;bQPO1G/vO&iQPO,5;PO)TQPO,5;OOVQPO1G/{O<PQPO1G0YO<aQPO7+$gOOQO7+$e7+$eO&iQPO7+$gOVQPO7+$mO&iQPO7+$uOOQO7+$w7+$wOOQO7+$z7+$zO<hQPO7+$zOOQO7+%Y7+%YOOQO1G/O1G/OO)QQPO,59eOOQO1G0h1G0hOOQO'#C`'#C`O<mQPO7+%^O=ZQPO1G0kOOQO1G0j1G0jOOQO7+%g7+%gOVQPO<<HRO=eQPO<<HRO=lQPO'#D{O=vQPO'#DROOQO'#EW'#EWOOQO'#C|'#C|O>[QPO<<HXO>dQPO<<HaO&iQPO<<HfOOQO1G/P1G/PO>kQPO<<HxO?YQPOAN=mOVQPOAN=mO&iQPO,59iO&iQPO,59kOVQPO,59hOOQOAN=sAN=sOVQPOAN={O?kQPOAN>QOOQOG23XG23XO?rQPOG23XO@TQPO1G/TO@_QPO1G/VOOQO1G/S1G/SO@iQPOG23gO@pQPOG23gOOQOG23lG23lOOQOLD(sLD(sOOQOLD)RLD)RO&iQPOLD)ROARQPO!$'LmOOQO!)9BX!)9BXO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OO9WQPO,59OOAYQPO1G.jOCRQPO1G.jOF}QPO1G.jOIXQPO1G.jOI`QPO1G.jOIgQPO1G.jOInQPO1G.j",
|
||||||
stateData: "KZ~O!iOS~OUaOVaOaSOdTOhUOkVOnWOvXOzZO![bO!^cO!mPO!nPO!oPO!pQO!y[O!z[O!{]O!|]O!}]O#O]O#P^O#TdO~O{jO~PVO!mlOXSXYSXZSX[SX]SX^SX_SX`SXjSX!QSX!RSX!SSX!TSX!USX!VSX!WSX!XSX!YSX!gSX!tSXcSX!bSX!cSX!dSX!eSXbSX!uSXtSXxSX![SX!^SX#TSXrSX!xSX~OXnOYoOZpO[qO]rO^sO_tO`uOjvO!QvO!RvO!SvO!TvO!UvO!VvO!WvO!XvO!YvO~O!g!jX~P%WOUaOVaOa}OdTOhUOkVOnWOvXOzZO!mPO!nPO!oPO!pQO!y[O!z[O!{]O!|]O!}]O#O]O#P^O~Oa!ROhUO~Od!TO~Od!UO~Od!VO~O{!WO~O!O!XO~O!O!YO~Oa!ZO~O{![O~O{!]O~Oa!bO!pQO~O!b#VX!c#VX!d#VX!e#VX!g!jX~O!b!eO!c!fO!d!gO!e!hO~O!t!rX~P%WOX!lXY!lXZ!lX[!lX]!lX^!lX_!lX`!lXj!lX!Q!lX!R!lX!S!lX!T!lX!U!lX!V!lX!W!lX!X!lX!Y!lX~Ob!lO!t!lX~P*QO!t!uO~Ob!vO!t!rX~Ob!wO!b#VX!c#VX!d#VX!e#VX~OXnOYoOZpO[qO]rO^sO_tO`uO~Oc!rX!t!rXx!rX~P,UOc!xO!t!uO~OX!lXY!lXZ!lX[!lX]!lX^!lX_!lX`!lX~Oj!yOc!lX!t!lX~P-VO![bO!^cO#TdO~Oj#XO!t#WO~Oj#^O~Ox#`O!t#_O~OXnOZWi[Wi]Wi^Wi_Wi`WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!gWibWi!tWicWi!bWi!cWi!dWi!eWi!uWixWi![Wi!^Wi#TWi!xWi~OYWi~P.pOYoO~P.pOXnOYoOZpO`uO]Wi^Wi_WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!gWibWi!tWicWi!bWi!cWi!dWi!eWi!uWixWi![Wi!^Wi#TWi!xWi~O[Wi~P1ROXnOYoOZpO[qO_tO`uO^WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!gWibWi!tWicWi!bWi!cWi!dWi!eWi!uWixWi![Wi!^Wi#TWi!xWi~O]Wi~P3]O]rO~P3]O[qO~P1RO[Wi]Wi^Wi_Wi`Wi~OXnOYoOZpOjWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!gWibWi!tWicWi!bWi!cWi!dWi!eWi!uWixWi![Wi!^Wi#TWi!xWi~P5uO!bQi!cQi!dQi!eQi!gQibQi![Qi!^Qi#TQicQi!xQi!uQi~P,UOb#cO~P,UOj#dO~O!u#eO~P,UOt#fO~Ox#gO!t!uO~Ob#hO~P,UOx#iO!t!uO~Ox#jO!t!uO~Oa#kO~Ob#mO!t!vX~O!t#nO~OUaOVaOa}OdTOhUOkVOnWOvXOzZO!mPO!nPO!oPO!p#pO!y[O!z[O!{]O!|]O!}]O#O]O#P^O~O!b!eO!d!ai!e!ai!g!aib!aic!ai!x!ai!u!ai~O!c!ai~P;vO!c!fO~P;vO!b!eO!c!fO!d!gO!e!ai!g!aib!aic!ai!x!ai!u!ai~Ob!si!t!sic!six!si~P,UO!u#uO~P,UOa#}O~OX$gOY$hOZ$iO[$jO]$kO^$lO_$mO`$nO~P&iOx#Xi!t#Xi~P,UO!u$RO~P,UOr$SOt$TO~P*QOcuX!b#VX!c#VX!d#VX!e#VX!xuX~Oc$VO!x$UO~O!u$WO~P,UOc$YO!b#VX!c#VX!d#VX!e#VX~Ob$aO~P,UOc$bO!b#VX!c#VX!d#VX!e#VX~Ocqi!xqi~P,UOcsi!xsi~P,UOc$cO~P%WO!u$dO!b#VX!c#VX!d#VX!e#VX~Oc$fO~P,UOX$gOUWiVWiYWiZWiaWidWihWikWinWivWizWi!mWi!nWi!oWi!pWi!yWi!zWi!{Wi!|Wi!}Wi#OWi#PWi~P5uOX$gOY$hOUWiVWiZWiaWidWihWikWinWivWizWi!mWi!nWi!oWi!pWi!yWi!zWi!{Wi!|Wi!}Wi#OWi#PWi~P5uOX$gOY$hOZ$iO`$nOUWiVWi]Wi^Wi_WiaWidWihWikWinWivWizWi!mWi!nWi!oWi!pWi!yWi!zWi!{Wi!|Wi!}Wi#OWi#PWi~O[Wi~PEROX$gOY$hOZ$iO[$jO_$mO`$nOUWiVWi^WiaWidWihWikWinWivWizWi!mWi!nWi!oWi!pWi!yWi!zWi!{Wi!|Wi!}Wi#OWi#PWi~O]Wi~PGPO]$kO~PGPO[$jO~PEROX$gOY$hOZ$iOUWiVWiaWidWihWikWinWivWizWi!mWi!nWi!oWi!pWi!yWi!zWi!{Wi!|Wi!}Wi#OWi#PWi~P5uO#P!y![zUV!{!|!}#O!z!pvnkn~",
|
stateData: "Kx~O!lOS~OUaOVaOaSOdTOhUOkVOnWOvXOzZO!]bO!_cO!adO!cdO!pPO!qPO!rPO!sQO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~O{hO~PVO!pjOXSXYSXZSX[SX]SX^SX_SX`SXjSX!QSX!RSX!SSX!TSX!USX!VSX!WSX!XSX!YSX!ZSX!jSX!wSXcSX!eSX!fSX!gSX!hSXbSX!xSXtSXxSXrSX!{SX~OXlOYmOZnO[oO]pO^qO_rO`sOjtO!QtO!RtO!StO!TtO!UtO!VtO!WtO!XtO!YtO!ZtO~O!j!mX~P%TOUaOVaOa{OdTOhUOkVOnWOvXOzZO!pPO!qPO!rPO!sQO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~Oa!POhUO~Od!RO~Od!SO~Od!TO~O{!UO~O!O!VO~O!O!WO~Oa!XO~O{!YO~O{!ZO~Oa!_O!sQO~O!e!bO!f!cO!g!dO!h!eO!j!mX~O!w!uX~P%TOX!oXY!oXZ!oX[!oX]!oX^!oX_!oX`!oXj!oX!Q!oX!R!oX!S!oX!T!oX!U!oX!V!oX!W!oX!X!oX!Y!oX!Z!oX~Ob!iO!w!oX~P)rO!w!rO~Ob!sO!w!uX~Ob!tO!e!bO!f!cO!g!dO!h!eO~OXlOYmOZnO[oO]pO^qO_rO`sO~Oc!uX!w!uXx!uX~P+yOc!uO!w!rO~OX!oXY!oXZ!oX[!oX]!oX^!oX_!oX`!oX~Oj!vOc!oX!w!oX~P,zOj#TO!w#SO~Oj#YO~Ox#[O!w#ZO~OXlOZWi[Wi]Wi^Wi_Wi`WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi!jWibWi!wWicWi!eWi!fWi!gWi!hWi!xWixWi!{Wi~OYWi~P.YOYmO~P.YOXlOYmOZnO`sO]Wi^Wi_WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi!jWibWi!wWicWi!eWi!fWi!gWi!hWi!xWixWi!{Wi~O[Wi~P0eOXlOYmOZnO[oO_rO`sO^WijWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi!jWibWi!wWicWi!eWi!fWi!gWi!hWi!xWixWi!{Wi~O]Wi~P2iO]pO~P2iO[oO~P0eO[Wi]Wi^Wi_Wi`Wi~OXlOYmOZnOjWi!QWi!RWi!SWi!TWi!UWi!VWi!WWi!XWi!YWi!ZWi!jWibWi!wWicWi!eWi!fWi!gWi!hWi!xWixWi!{Wi~P4{O!eQi!fQi!gQi!hQi!jQibQicQi!{Qi!xQi~P+yOb#_O~P+yOj#`O~O!x#aO~P+yOt#bO~Ox#cO!w!rO~Ob#dO~P+yOx#eO!w!rO~Ox#fO!w!rO~Ob#gO!w!yX~O!w#hO~OUaOVaOa{OdTOhUOkVOnWOvXOzZO!pPO!qPO!rPO!s#jO!|[O!}[O#O]O#P]O#Q]O#R]O#S^O~O!e!bO!g!di!h!di!j!dib!dic!di!{!di!x!di~O!f!di~P:hO!f!cO~P:hO!e!bO!f!cO!g!dO!h!di!j!dib!dic!di!{!di!x!di~Ob!vi!w!vic!vix!vi~P+yO!x#oO~P+yOa#wO~OX$aOY$bOZ$cO[$dO]$eO^$fO_$gO`$hO~PVOx#Xi!w#Xi~P+yO!x#{O~P+yOr#|Ot#}O~P)rO!e!bO!f!cO!g!dO!h!eOcuX!{uX~Oc$PO!{$OO~O!x$QO~P+yO!e!bO!f!cO!g!dO!h!eO!j!`yb!`yc!`y!{!`y!x!`y~Oc$SO!e!bO!f!cO!g!dO!h!eO~Ob$ZO~P+yOc$[O!e!bO!f!cO!g!dO!h!eO~Ocqi!{qi~P+yOcsi!{si~P+yOc$]O~P%TO!e!bO!f!cO!g!dO!h!eO!x$^O~Oc$`O~P+yOX$aOUWiVWiYWiZWiaWidWihWikWinWivWizWi!]Wi!_Wi!aWi!cWi!pWi!qWi!rWi!sWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{OX$aOY$bOUWiVWiZWiaWidWihWikWinWivWizWi!]Wi!_Wi!aWi!cWi!pWi!qWi!rWi!sWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{OX$aOY$bOZ$cO`$hOUWiVWi]Wi^Wi_WiaWidWihWikWinWivWizWi!]Wi!_Wi!aWi!cWi!pWi!qWi!rWi!sWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~O[Wi~PDzOX$aOY$bOZ$cO[$dO_$gO`$hOUWiVWi^WiaWidWihWikWinWivWizWi!]Wi!_Wi!aWi!cWi!pWi!qWi!rWi!sWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~O]Wi~PGUO]$eO~PGUO[$dO~PDzOX$aOY$bOZ$cOUWiVWiaWidWihWikWinWivWizWi!]Wi!_Wi!aWi!cWi!pWi!qWi!rWi!sWi!|Wi!}Wi#OWi#PWi#QWi#RWi#SWi~P4{O#S!|!]zUV#O#P#Q#R!}!svnkn~",
|
||||||
goto: "3Y#YPP#Z#n$t&[PP&_PPPPPPPPPPPP'g'g(mP'gPP)v*YP'g*]*`P*`P*`P'gP#nPP#n*dP+jPPPPPPPPP,pP,pP,p-Q-TPPPP-dPPP-g-m.YPPPP#n0t1UPP1`1cPPPPPPPP1i1{2RP2e2h3P3SjiOS!e!f!g!h#`#e#k#u$R$U$WT!_c#q#XaOSTcnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$n#QaOScnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#f#k#q#u#}$R$S$T$W$d$g$h$i$j$k$l$m$nQ!QT[!ad!T!V!b#W#nS!ij#_T#w#e$URmQ#SaOTcnopqrstuv!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$nTxS}#XYOSTcnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$n#WYOSTcnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$nR!SUQ!ddQ!{!TQ!}!VQ#T!bQ#o#WR$O#nR#U!bR#{#eT#y#e$U#X_OSTcnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$n#X`OSTcnopqrstuv}!R!U!W!Z![!]!e!f!g!h!u!y#X#^#`#d#e#f#k#q#u#}$R$S$T$U$W$d$g$h$i$j$k$l$m$nmeOS!_!e!f!g!h#`#e#k#u$R$U$WR!cdkiOS!e!f!g!h#`#e#k#u$R$U$WRkOQkOR#t#`SfO#`Wg!e!f!g!hS{S#kS#x#e$UQ$Q#uQ$Z$RR$`$WSRO#`QwSY|T}!W![!]f!^c!e!f!g!h#e#k#q#u$R$US!ln$gQ!moQ!npQ!oqQ!prQ!qsQ!rtQ!suQ!tvQ!z!RQ!|!UQ#P!ZQ#a!uQ#b!yQ#q#XQ#r#^Q#v#dQ#|#fQ$X#}Q$[$SQ$]$TQ$_$WQ$e$dQ$o$hQ$p$iQ$q$jQ$r$kQ$s$lQ$t$mR$u$nSyS}Q!OTQ#O!WQ#Q![R#R!]SzS}X!PT!W![!]R#V!bQ#z#eR$^$UjiOS!e!f!g!h#`#e#k#u$R$U$WR#S!_Q!`cR$P#qjgOS!e!f!g!h#`#e#k#u$R$U$WR#l#SR!ddbhOS#`#e#k#u$R$U$WQ#Y!eQ#Z!fQ#[!gR#]!hR!kjQ!jjR#s#_",
|
goto: "1f#YPP#Z#k$p&VPP&YPPPPPPPPPPPP'a'a(fP'aPP)n*QP'a*T*WP*WP*WP'aP#kPP#k*[P+aPPPPPPPPPP,fP,fP,fP,vP#ZPPPP,yPPP,|-S-zPPPP#k0e0uPP1P1SPPPPPPPP#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",
|
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,
|
maxTerm: 101,
|
||||||
nodeProps: [
|
nodeProps: [
|
||||||
["closedBy", 17,")",20,"}"],
|
["closedBy", 17,")",20,"}"],
|
||||||
|
@ -15,8 +15,8 @@ export const parser = LRParser.deserialize({
|
||||||
propSources: [highlighting],
|
propSources: [highlighting],
|
||||||
skippedNodes: [0],
|
skippedNodes: [0],
|
||||||
repeatNodeCount: 0,
|
repeatNodeCount: 0,
|
||||||
tokenData: "4X~R!iX^%ppq%pvw&exy&jyz&oz{&t{|&y|}'O}!O'T!Q!R'Y!R!['b![!]'}!]!^(b!_!`(g!`!a(l!c!d(q!e!f(q!f!g)P!h!i)X!k!l)o!r!s)t!t!u*[!u!v(q!v!w(q!z!{(q!|!}*l!}#O*q#O#P*v#P#Q*{#R#S+Q#T#U+Q#U#V+]#V#W,o#W#X.O#X#d+Q#d#e0U#e#f+Q#f#g0t#g#o+Q#o#p1u#p#q1z#q#r2P#y#z%p$f$g%p$r$s2U%o%p2Z5i6S+Q#BY#BZ%p$IS$I_%p$I|$JO%p$JT$JU%p$KV$KW%p% l% m2`%%Y%%Z2e%%[%%]2j%&Y%&Z2o%&]%&^2o%&_%&`2t%&`%&a2y%&b%&c3O%&c%&d3T%'S%'T3Y%'T%'U3_%'U%'V3d%(^%(_3i%(b%(c3n%(c%(d3s%)Q%)R3x%)S%)T3}%)U%)V4S&FU&FV%p~%uY!i~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!e~~&oOa~~&tOb~~&yOZ~~'OOX~~'TO!t~~'YOY~P'_P!mP!Q!['YR'iQ!OQ!mP|}'o!Q!['YQ'rP!R!['uQ'zP!OQ|}'o~(QQ!_!`(W%&b%&c(]~(]Ot~~(bOr~~(gO!x~~(lO!Y~~(qO!U~~(tP!Q![(w~(|PU~!Q![(w~)UPk~!Q![(w~)[Q!Q![)b#]#^)j~)gPz~!Q![)b~)oO#P~~)tOn~~)wQ!Q![)}#f#g*V~*SP![~!Q![)}~*[O!y~~*aPv~!Q![*d~*iPV~!Q![*d~*qO!o~~*vO{~~*{O]~~+QOx~~+VQ!p~#T#o+Q5i6S+Q~+bS!p~#T#c+Q#c#d+n#d#o+Q5i6S+Q~+sS!p~#T#c+Q#c#d,P#d#o+Q5i6S+Q~,US!p~#T#`+Q#`#a,b#a#o+Q5i6S+Q~,iQ!|~!p~#T#o+Q5i6S+Q~,tR!p~#T#U,}#U#o+Q5i6S+Q~-SS!p~#T#f+Q#f#g-`#g#o+Q5i6S+Q~-eS!p~#T#W+Q#W#X-q#X#o+Q5i6S+Q~-xQ!{~!p~#T#o+Q5i6S+Q~.TS!p~#T#X+Q#X#Y.a#Y#o+Q5i6S+Q~.fS!p~#T#U+Q#U#V.r#V#o+Q5i6S+Q~.wS!p~#T#c+Q#c#d/T#d#o+Q5i6S+Q~/YS!p~#T#c+Q#c#d/f#d#o+Q5i6S+Q~/kS!p~#T#`+Q#`#a/w#a#o+Q5i6S+Q~0OQ!}~!p~#T#o+Q5i6S+Q~0ZS!p~#T#f+Q#f#g0g#g#o+Q5i6S+Q~0nQ!z~!p~#T#o+Q5i6S+Q~0yS!p~#T#X+Q#X#Y1V#Y#o+Q5i6S+Q~1[S!p~#T#W+Q#W#X1h#X#o+Q5i6S+Q~1oQ#O~!p~#T#o+Q5i6S+Q~1zOd~~2PO!u~~2UOc~~2ZO!^~~2`O`~~2eOh~~2jO!c~~2oO!b~~2tO#T~~2yO!n~~3OO^~~3TOj~~3YO!Q~~3_O!d~~3dO_~~3iO[~~3nO!X~~3sO!W~~3xO!V~~3}O!T~~4SO!S~~4XO!R~",
|
tokenData: "4f~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q!R']!RX!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~",
|
||||||
tokenizers: [0, 1],
|
tokenizers: [0, 1],
|
||||||
topRules: {"Expression":[0,1]},
|
topRules: {"Expression":[0,1]},
|
||||||
tokenPrec: 1926
|
tokenPrec: 1955
|
||||||
})
|
})
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
log_and @left,
|
log_and @left,
|
||||||
set_decart @left set_union @left set_intersect @left set_minus @left set_symminus @left,
|
set_decart @left set_union @left set_intersect @left set_minus @left set_symminus @left,
|
||||||
set_bool @right,
|
set_bool @right,
|
||||||
|
quant @right,
|
||||||
p1, p2
|
p1, p2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,8 +34,6 @@
|
||||||
debool { "debool" }
|
debool { "debool" }
|
||||||
red { "red" }
|
red { "red" }
|
||||||
|
|
||||||
quantifier { $[∀∃] }
|
|
||||||
|
|
||||||
Global { $[XCSDAT]$[0-9]+ }
|
Global { $[XCSDAT]$[0-9]+ }
|
||||||
Function { "F"$[0-9]+ }
|
Function { "F"$[0-9]+ }
|
||||||
Predicate { "P"$[0-9]+ }
|
Predicate { "P"$[0-9]+ }
|
||||||
|
@ -45,10 +44,10 @@
|
||||||
PrefixD { "D" }
|
PrefixD { "D" }
|
||||||
|
|
||||||
"¬"
|
"¬"
|
||||||
"⇔" "⇒" "∨" "&"
|
"∀" "∃" "⇔" "⇒" "∨" "&"
|
||||||
"ℬ"
|
"ℬ"
|
||||||
"+" "-" "*" "∪" "\\" "∆" "∩" "×"
|
"+" "-" "*" "∪" "\\" "∆" "∩" "×"
|
||||||
"∈" "∉" "⊆" "⊄" "⊂" ">" "≥" "≤" "≠" "="
|
"∈" "∉" "⊆" "⊄" "⊂" ">" "≥" "≤" "<" "≠" "="
|
||||||
":∈" ":="
|
":∈" ":="
|
||||||
|
|
||||||
"[" "]"
|
"[" "]"
|
||||||
|
@ -87,19 +86,18 @@ declaration { Local "∈" term }
|
||||||
logic {
|
logic {
|
||||||
LogicPredicate |
|
LogicPredicate |
|
||||||
logicUnary |
|
logicUnary |
|
||||||
LogicBinary
|
LogicBinary |
|
||||||
}
|
|
||||||
logic_all { logic | logic_par }
|
|
||||||
logic_par { "(" logic ")" }
|
|
||||||
logic_no_binary {
|
|
||||||
LogicPredicate
|
|
||||||
logicUnary
|
|
||||||
logic_par
|
logic_par
|
||||||
}
|
}
|
||||||
|
logic_par { "(" logic ")" }
|
||||||
logicUnary {
|
logicUnary {
|
||||||
PredicateCall { Predicate "[" term_enum "]" } |
|
PredicateCall { Predicate "[" term_enum "]" } |
|
||||||
LogicNegation { !not "¬" logic_no_binary } |
|
LogicNegation { !not "¬" logic } |
|
||||||
LogicQuantor { quantifier QuantorVariable "∈" term logic_no_binary }
|
LogicQuantor
|
||||||
|
}
|
||||||
|
LogicQuantor {
|
||||||
|
"∀" QuantorVariable "∈" term !quant logic |
|
||||||
|
"∃" QuantorVariable "∈" term !quant logic
|
||||||
}
|
}
|
||||||
|
|
||||||
LogicPredicate {
|
LogicPredicate {
|
||||||
|
@ -110,16 +108,17 @@ LogicPredicate {
|
||||||
term "⊂" term |
|
term "⊂" term |
|
||||||
term ">" term |
|
term ">" term |
|
||||||
term "≥" term |
|
term "≥" term |
|
||||||
|
term "<" term |
|
||||||
term "≤" term |
|
term "≤" term |
|
||||||
term "≠" term |
|
term "≠" term |
|
||||||
term "=" term
|
term "=" term
|
||||||
}
|
}
|
||||||
|
|
||||||
LogicBinary {
|
LogicBinary {
|
||||||
logic_all !log_equiv "⇔" logic_all |
|
logic !log_equiv "⇔" logic |
|
||||||
logic_all !log_impl "⇒" logic_all |
|
logic !log_impl "⇒" logic |
|
||||||
logic_all !log_or "∨" logic_all |
|
logic !log_or "∨" logic |
|
||||||
logic_all !log_and "&" logic_all
|
logic !log_and "&" logic
|
||||||
}
|
}
|
||||||
|
|
||||||
QuantorVariable { Variable | quant_var_enum }
|
QuantorVariable { Variable | quant_var_enum }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user