// shift-reduce parser for language Q / end-of-input/stack i:_ci 255 / operator classes o:(,"|";,"&";"=<>";"+-";"*/";,"^";"~_";,"(";,")";,i) / |&=+*^~()Z / shift-reduce table: s = shift -> right assoc, r = reduce -> left assoc s:("rsssssssrr" / | "rrssssssrr" / & "rrrsssssrr" / = < > "rrrrssssrr" / + - "rrrrrsssrr" / * / "rrrrrrssrr" / ^ "rrrrrrrsrr" / ~ _ "sssssssssR" / ( "rrrrrrrrrr" / ) "ssssssssLa") / i / | & = + * ^ ~ ( ) i c w:2 2 2 2 2 2 1 0 -2 0 0 / parser p:{**|q/("";x,i;,i;())} / done;todo;operator;value q:{h[`$(s,'"n"). r'x[2 1;0]]. x} / shift|reduce|accept|error r:{(|/'x _in/:o)?1} / class of token / parser transition operators h.a:{[j;i;o;v](j;i;o;v)} / accept h.s:{[j;i;o;v](j,*i;1_ i;i[,0],o;v)} / shift operator -> o-stack h.r:{[j;i;o;v]:[0 v-stack / reduction operators h.v:{[j;i;o;v]:[~0#v;h.e[j,*i]"valence";n]} / valence of o or error h.o:{[j;i;o;v;n](j;i;1_ o;(,o[0],|n#v),n _ v)} / o = f v1 .. vn h.p:{[j;i;o;v;n](j;i;(-n)_ o;v)} / o = ( or ) / parser error states h.L:{[j;i;o;v]h.e[j,*i]"missing ("} / missing ( h.R:{[j;i;o;v]h.e[j,*i]"missing )"} / missing ) / signal error h.e:{'x,"\n",((0|-1+#x)#""),"^ ",$y} / ^ error