Simplify grammar and sync with ConceptCore

This commit is contained in:
IRBorisov 2024-05-06 21:54:25 +03:00
parent 435411eba7
commit abc24822d2
7 changed files with 303 additions and 231 deletions

View File

@ -105,6 +105,7 @@
"rsgraph", "rsgraph",
"rslang", "rslang",
"rstemplates", "rstemplates",
"setexpr",
"SIDELIST", "SIDELIST",
"signup", "signup",
"Slng", "Slng",

View File

@ -135,6 +135,7 @@ This is the build for local Development
- copy import wheels from ConceptCore to rsconcept/backend/import - copy import wheels from ConceptCore to rsconcept/backend/import
- run rsconcept/backend/LocalEnvSetup.ps1 - run rsconcept/backend/LocalEnvSetup.ps1
- use VSCode configs in root folder to start development - 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 ## 🔭 Local docker build

View File

@ -1,36 +1,16 @@
// This file was generated by lezer-generator. You probably shouldn't edit it. // This file was generated by lezer-generator. You probably shouldn't edit it.
export const export const
Expression = 1, Expression = 1,
LogicPredicate = 2, Literal = 2,
Literal = 3, Local = 3,
Local = 4, Index = 4,
Index = 5, Global = 5,
Global = 6, Radical = 6,
Radical = 7, Filter = 20,
BinaryOperation = 8, ComplexIndex = 21,
Enumeration = 21, PrefixD = 26,
Tuple = 22, PrefixI = 27,
Boolean = 23, PrefixR = 31,
Declarative = 25, Function = 32,
PrefixD = 28, TextFunction = 33,
Variable = 29, Predicate = 45
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

View File

@ -8,37 +8,45 @@ 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[Literal][<][Literal]]'],
['12=41', '[Expression[LogicPredicate[Literal][=][Literal]]]'], ['12=41', '[Expression[Literal][=][Literal]]'],
['ξ=ξ', '[Expression[LogicPredicate[Local][=][Local]]]'], ['ξ=ξ', '[Expression[Local][=][Local]]'],
['0-5', '[Expression[BinaryOperation[Literal][-][Literal]]]'], ['0-5', '[Expression[Literal][-][Literal]]'],
['¬2=2', '[Expression[LogicNegation[¬][LogicPredicate[Literal][=][Literal]]]]'], ['¬2=2', '[Expression[¬][Literal][=][Literal]]'],
['12+41', '[Expression[BinaryOperation[Literal][+][Literal]]]'], ['12+41', '[Expression[Literal][+][Literal]]'],
['1+2*5', '[Expression[BinaryOperation[BinaryOperation[Literal][+][Literal]][*][Literal]]]'], ['1+2*5', '[Expression[Literal][+][Literal][*][Literal]]'],
['a1Z', '[Expression[BinaryOperation[Local[Index]][][Literal]]]'], ['a1Z', '[Expression[Local[Index]][][Literal]]'],
['Pr1(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'], ['Pr1(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'],
['Pr11(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'], ['Pr11(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'],
['Pr11,21(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'], ['Pr11,21(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'],
['pr1(S1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'], ['pr1(S1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'],
['Pr1,2(X1)', '[Expression[TextFunctionExpression[TextFunction[ComplexIndex]][(][Global][)]]]'], ['Pr1,2(X1)', '[Expression[TextFunction[ComplexIndex]][(][Global][)]]'],
['card(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], ['card(X1)', '[Expression[TextFunction][(][Global][)]]'],
['red(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], ['red(X1)', '[Expression[TextFunction][(][Global][)]]'],
['bool(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], ['bool(X1)', '[Expression[TextFunction][(][Global][)]]'],
['debool(X1)', '[Expression[TextFunctionExpression[TextFunction][(][Global][)]]]'], ['debool(X1)', '[Expression[TextFunction][(][Global][)]]'],
['Fi1,2[ξ, ξ](ξ)', '[Expression[TextFunctionExpression[Filter[ComplexIndex]][[][Local][Local][]][(][Local][)]]]'], ['Fi1,2[ξ, ξ](ξ)', '[Expression[Filter][ComplexIndex][[][Local][Local][]][(][Local][)]]'],
['(X1)', '[Expression[Boolean[][Boolean[][(][Global][)]]]]'], ['(X1)', '[Expression[][][(][Global][)]]'],
['P2[S1]', '[Expression[PredicateCall[Predicate][[][Global][]]]]'], ['P2[S1]', '[Expression[Predicate][[][Global][]]]'],
['[σ∈R1×R1] F6[σ]', '[Expression[FunctionDeclaration[[][Local][∈][BinaryOperation[Radical][×][Radical]][]][FunctionCall[Function][[][Local][]]]]]'], ['[σ∈R1×R1] F6[σ]', '[Expression[[][Local][∈][Radical][×][Radical][]][Function][[][Local][]]]'],
['D{ξ∈red(S1) | ξ=ξ}', '[Expression[Declarative[PrefixD][{][Variable[Local]][∈][TextFunctionExpression[TextFunction][(][Global][)]][|][LogicPredicate[Local][=][Local]][}]]]'], ['D{ξ∈red(S1) | ξ=ξ}', '[Expression[PrefixD][{][Local][∈][TextFunction][(][Global][)][|][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][]]]][}]]]'], 'I{(σ, γ) | σ:∈X1; γ:=F1[σ]; P1[σ, γ]}',
['∀ξ∈∅ 1=1', '[Expression[LogicQuantor[∀][QuantorVariable[Variable[Local]]][∈][Literal][LogicPredicate[Literal][=][Literal]]]]'], '[Expression[PrefixI][{][(][Local][Local][)][|][Local][:∈][Global][;][Local][:=][Function][[][Local][]][;][Predicate][[][Local][Local][]][}]]'
['∀ξ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]]]][)]]]'] ],
[
'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', () => { describe('Testing RSParser', () => {
it.each(testData)('Parse %p', it.each(testData)('Parse %p', (input: string, expectedTree: string) => {
(input: string, expectedTree: string) => {
// NOTE: use strict parser to determine exact error position // NOTE: use strict parser to determine exact error position
// const tree = parser.configure({strict: true}).parse(input); // const tree = parser.configure({strict: true}).parse(input);
const tree = parser.parse(input); const tree = parser.parse(input);

View File

@ -3,20 +3,16 @@ import {LRParser} from "@lezer/lr"
import {highlighting} from "./highlight" import {highlighting} from "./highlight"
export const parser = LRParser.deserialize({ export const parser = LRParser.deserialize({
version: 14, 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<PQPO1G0[O<aQPO7+$gOOQO7+$e7+$eO&iQPO7+$gOVQPO7+$nO&iQPO7+$wOOQO7+$y7+$yOOQO7+$|7+$|O<hQPO7+$|OOQO7+%[7+%[OOQO1G/P1G/PO)QQPO,59fOOQO1G0h1G0hOOQO'#C`'#C`O<mQPO7+%`O=ZQPO1G0kOOQO1G0j1G0jOOQO7+%i7+%iOVQPO<<HRO=eQPO<<HRO=lQPO'#D}O=vQPO'#DSOOQO'#EX'#EXOOQO'#C}'#C}O>[QPO<<HYO>dQPO<<HcO&iQPO<<HhOOQO1G/Q1G/QO>kQPO<<HzO?YQPOAN=mOVQPOAN=mO&iQPO,59jO&iQPO,59lOVQPO,59iOOQOAN=tAN=tOVQPOAN=}O?kQPOAN>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", 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/xO<TQPO7+%iOOQO7+%g7+%gO<[QPO7+%hO&iQPO7+%iOVQPO7+%mO&iQPO7+%pOOQO7+%Y7+%YOOQO7+%w7+%wOOQO1G0O1G0OO({QPO,5:eOOQO1G0_1G0_OOQO'#C_'#C_O<dQPO7+%wO=QQPO1G0cOOQO1G0b1G0bOOQO7+%{7+%{OVQPO<<ITO=[QPO<<ISO=aQPO<<ITO=hQPO'#DlO>eQPO'#D}OOQO'#D|'#D|O>yQPO<<IXO?RQPO<<I[OOQO1G0P1G0PO?YQPO<<IcO?wQPOAN>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: "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~", 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: "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", 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 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 Literal Local Index Global Radical + - * \\ ∆ ∩ × ( ) { } Filter ComplexIndex [ ] ∈ | PrefixD PrefixI :∈ := ; PrefixR Function TextFunction ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = ¬ Predicate ∀ ∃ ⇔ ⇒ &",
maxTerm: 101, maxTerm: 93,
nodeProps: [
["closedBy", 17,")",20,"}"],
["openedBy", 18,"(",19,"{"]
],
propSources: [highlighting], propSources: [highlighting],
skippedNodes: [0], skippedNodes: [0],
repeatNodeCount: 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], tokenizers: [0, 1],
topRules: {"Expression":[0,1]}, topRules: {"Expression":[0,1]},
tokenPrec: 1955 tokenPrec: 1974
}) })

View File

@ -1,3 +1,12 @@
///////////////////////////////////////////////////////////
// ------------- Generator Definitions --------------------
///////////////////////////////////////////////////////////
@detectDelim
@external propSource highlighting from "./highlight"
///////////////////////////////////////////////////////////
// ------------- Precedence Definitions --------------------
///////////////////////////////////////////////////////////
@precedence { @precedence {
plus @left minus @left, plus @left minus @left,
times @left, times @left,
@ -12,36 +21,32 @@
p1, p2 p1, p2
} }
@top Expression { ///////////////////////////////////////////////////////////
term_or_logic | // ------------- Terminal Tokens --------------------------
FunctionDeclaration ///////////////////////////////////////////////////////////
}
@skip { space }
@tokens { @tokens {
space { @whitespace+ } space { @whitespace+ }
ComplexIndex { $[1-9]$[0-9]*(","$[1-9]$[0-9]*)* } ComplexIndex { $[1-9]$[0-9]*(","$[1-9]$[0-9]*)* }
integer { $[0-9]+ } integer { $[0-9]+ }
emptySet { "∅" } emptySet { "∅" }
integerSet { "Z" } integerSet { "Z" }
bigPr { "Pr" } bigPr { "Pr" }
smallPr { "pr" } smallPr { "pr" }
filter { "Fi" } Filter { "Fi" }
card { "card" } card { "card" }
bool { "bool" } bool { "bool" }
debool { "debool" } debool { "debool" }
red { "red" } red { "red" }
Global { $[XCSDAT]$[0-9]+ } Global { $[XCSDAT]$[0-9]+ }
Function { "F"$[0-9]+ } Function { "F"$[0-9]+ }
Predicate { "P"$[0-9]+ } Predicate { "P"$[0-9]+ }
Radical { "R"$[0-9]+ } Radical { "R"$[0-9]+ }
local { $[_a-zα-ω]($[a-zα-ω])* } local { $[_a-zα-ω]($[a-zα-ω])* }
PrefixR { "R" } PrefixR { "R" }
PrefixI { "I" } PrefixI { "I" }
PrefixD { "D" } PrefixD { "D" }
"¬" "¬"
"∀" "∃" "⇔" "⇒" "" "&" "∀" "∃" "⇔" "⇒" "" "&"
@ -55,146 +60,207 @@
"{" "}" "{" "}"
"(" ")" "(" ")"
@precedence { filter bigPr Predicate Function Global Radical PrefixR PrefixI PrefixD } @precedence {
@precedence { card bool debool red smallPr local } 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 { Local {
!p1 local | !p1 local |
!p2 local Index !p2 local Index
} }
Index {
Literal { integer | emptySet | integerSet } integer
}
TextFunction { variable {
bigPr ComplexIndex | Local |
smallPr ComplexIndex | "(" variableComposite ")"
card | bool | debool | red }
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 { logic {
LogicPredicate | logic_predicates |
logicUnary | logic_unary |
LogicBinary | logic_binary |
logic_par "(" logic ")"
}
logic_par { "(" logic ")" }
logicUnary {
PredicateCall { Predicate "[" term_enum "]" } |
LogicNegation { !not "¬" logic } |
LogicQuantor
}
LogicQuantor {
"∀" QuantorVariable "∈" term !quant logic |
"∃" QuantorVariable "∈" term !quant logic
} }
LogicPredicate { logic_predicates {
term "∈" term | setexpr "∈" setexpr |
term "∉" term | setexpr "∉" setexpr |
term "⊆" term | setexpr "⊆" setexpr |
term "⊄" term | setexpr "⊄" setexpr |
term "⊂" term | setexpr "⊂" setexpr |
term ">" term | setexpr ">" setexpr |
term "≥" term | setexpr "≥" setexpr |
term "<" term | setexpr "<" setexpr |
term "≤" term | setexpr "≤" setexpr |
term "≠" term | setexpr "≠" setexpr |
term "=" term 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_equiv "⇔" logic |
logic !log_impl "⇒" logic | logic !log_impl "⇒" logic |
logic !log_or "" logic | logic !log_or "" logic |
logic !log_and "&" 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 { // ------------------------- Set Expressions ----------------------------------
Literal | Local | Global | Radical | setexpr {
BinaryOperation | Literal |
typed_constructors | identifier |
FunctionCall | setexpr_binary |
TextFunctionExpression setexpr_generators |
Function "[" setexpr_enum "]" |
TextFunction "(" setexpr ")"
} }
FunctionCall { Function "[" term_enum "]" } TextFunction {
bigPr ComplexIndex |
TextFunctionExpression { smallPr ComplexIndex |
TextFunction "(" term ")" | card |
Filter "[" term_enum "]" "(" term ")" bool |
debool |
red
}
setexpr_enum {
setexpr |
setexpr_enum_min2
}
setexpr_enum_min2 {
setexpr_enum "," setexpr
} }
BinaryOperation { Literal {
term !plus "+" term | integer |
term !minus "-" term | emptySet |
term !times "*" term | integerSet
term !set_union "" term | }
term !set_minus "\\" term | identifier {
term !set_symminus "∆" term | Local |
term !set_intersect "∩" term | Global |
term !set_decart "×" term | Radical
"(" BinaryOperation ")"
} }
typed_constructors { setexpr_binary {
Enumeration | setexpr !plus "+" setexpr |
Tuple | setexpr !minus "-" setexpr |
Boolean | setexpr !times "*" setexpr |
Declarative | setexpr !set_union "" setexpr |
Imperative | setexpr !set_minus "\\" setexpr |
Recursion setexpr !set_symminus "∆" setexpr |
} setexpr !set_intersect "∩" setexpr |
Enumeration { "{" term_enum "}"} setexpr !set_decart "×" setexpr |
Tuple { "(" term_enum_min2 ")"} "(" setexpr_binary ")"
Boolean {
!set_bool "" "(" term ")" |
!set_bool "" Boolean
} }
term_enum { term | term_enum_min2 } setexpr_generators {
term_enum_min2 { term_enum "," term } 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 { declarative {
"{" Local "∈" term "|" logic "}" | "{" Local "∈" setexpr "|" logic "}" |
PrefixD "{" Variable "∈" term "|" logic "}" PrefixD "{" variable "∈" setexpr "|" logic "}"
} }
Recursion { recursion {
PrefixR "{" Variable ":=" term ("|" logic)? "|" term "}" PrefixR "{" variable ":=" setexpr ("|" logic)? "|" setexpr "}"
} }
Imperative { imperative {
PrefixI "{" term "|" ImperativeBlocks "}" PrefixI "{" setexpr "|" imp_blocks "}"
} }
ImperativeBlocks { imp_blocks {
imp_block | imp_block |
ImperativeBlocks ";" imp_block imp_blocks ";" imp_block
} }
imp_block { imp_block {
ImperativeIteration | Local ":∈" setexpr |
ImperativeAssignment | Local ":=" setexpr |
ImperativeCondition logic
} }
ImperativeIteration { Local ":∈" term }
ImperativeAssignment { Local ":=" term }
ImperativeCondition { logic }
@detectDelim
@external propSource highlighting from "./highlight"

View File

@ -1,44 +1,68 @@
@detectDelim
@external propSource highlighting from "./highlight"
@top Expression { token* } @top Expression { token* }
@skip { space } @skip { space }
@tokens { @tokens {
space { @whitespace+ } space { @whitespace+ }
Index { $[0-9]+ } Index { $[0-9]+ }
ComplexIndex { $[1-9](","$[1-9])* } ComplexIndex { $[1-9](","$[1-9])* }
Integer { space$[0-9]+space? } Integer { space$[0-9]+space? }
bigPr { "Pr" } bigPr { "Pr" }
smallPr { "pr" } smallPr { "pr" }
filter { "Fi" } filter { "Fi" }
card { "card" } card { "card" }
bool { "bool" } bool { "bool" }
debool { "debool" } debool { "debool" }
red { "red" } red { "red" }
ConstructPrefix { "D" | "R" | "I" } ConstructPrefix { "D" | "R" | "I" }
Global { $[XCSDAPTF]$[0-9]+ } Global { $[XCSDAPTF]$[0-9]+ }
Radical { "R"$[0-9]+ } Radical { "R"$[0-9]+ }
local { $[_a-zα-ω]$[a-zα-ω]* } local { $[_a-zα-ω]$[a-zα-ω]* }
"(" ")" "(" ")"
"[" "]" "[" "]"
"{" "}" "{" "}"
@precedence { filter bigPr Global Radical ConstructPrefix } @precedence {
@precedence { card bool debool red smallPr local } filter
@precedence { Integer space } bigPr
Global
Radical
ConstructPrefix
}
@precedence {
card
bool
debool
red
smallPr
local
}
@precedence {
Integer
space
}
} }
TextFunction { TextFunction {
bigPr ComplexIndex | bigPr ComplexIndex |
smallPr ComplexIndex | smallPr ComplexIndex |
filter ComplexIndex | filter ComplexIndex |
card | bool | debool | red card |
bool |
debool |
red
} }
Local { local Index? } Local {
local Index?
}
token { token {
TextFunction | TextFunction |
@ -47,8 +71,4 @@ token {
Global | Global |
Radical | Radical |
Local Local
} }
@detectDelim
@external propSource highlighting from "./highlight"