
"// parser Som-som generated from parse-grammar.txt 22 Sept 2009"  
"// global: Nlv, tok, tokvalue, nenum"

top = tkTO fundef | tkCOLON macro | ex %
fundef =
  tkIDEN "ypush tokvalue" args "setfname tyFUNC" tkEQ ex "dofun tkTO" %
macro =
  tkIDEN "ypush tokvalue" args "setfname tyMAC" tkEQ ex "dofun tkCOLON" %
args =
  tkIDEN "enterLocal tokvalue" args |
  tkBAR "ypush Nlv" local |
  "ypush Nlv" nil %
local = tkIDEN "enterLocal tokvalue" local | nil %

ex = tkBB "ypush MARK" exs tkBE "doblock" | ex1 %
exs = ex1 exs | nil %
ex1 =
  tkIF ex0 ex exelse "doif" |
  tkWHILE ex0 ex "dowhile" |
  tkFOR tkIDEN "ypush tokvalue" ex0 ex0 ex "dofor" |
  tkCASE ex0 tkBB "ypush MARK" caselist tkBE "docase" |
  tkENUM tkBB elist tkBE "ypush NIL" |
  tkBREAK "ypush list newatom OPER tkBREAK" |
  exas %

// modify BREAK to be a list  11 Oct 2009
// tkBREAK "ypush list newatom OPER tkBREAK" 

exelse = tkELSE ex "ypush MARK" | nil %
elist = tkNUMBER "nenum = tokvalue" elist2 | elist2 %
elist2 = tkIDEN "doenum" elist2 | nil %
caselist =
  label tkCOLON ex caselist |
  tkELSE "donum #ff" tkCOLON ex |
  nil %

label =
  tkNUMBER "donum tokvalue" |
  tkIDEN "dolabel" %

ex0 = term terms %
terms = bop term "dobop" terms | nil %
term [ a ] =
  tkNUMBER "donum tokvalue" |
  tkSTRING "dostring" |
  tkIDEN "a = tokvalue" "doiden a" |
  tkNOT ex0 "douop tkNOT" |
  tkARRAY aspec |
  tkSYSCALL tuple "dosys" |
  tkLPAREN ex0 tkRPAREN %

//    correct 10 June 2006, som v23
aspec [ a ] =
  tkBB "a = array 0" alist tkBE "ypush newatom ADS a" |
  ex0 "douop tkARRAY" %

alist = aitem alist | nil %
aitem =
  tkNUMBER "M[newdata] = tokvalue" |
  tkSTRING "akeepStr" |
  tkIDEN "akeepIden" %

tuple =
  tkBB tkNUMBER "ypush MARK donum tokvalue" tuples tkBE %
tuples = ex0 tuples | nil %

mod = tkLBRACKET ex0 tkRBRACKET "dovec" | nil %

bop =
  tkPLUS "ypush tok" | tkMINUS "ypush tok" |
  tkSTAR "ypush tok" | tkSLASH "ypush tok" |
  tkAND "ypush tok"  | tkBAR "ypush tok"   |
  tkCARET "ypush tok"| tkEQEQ "ypush tok"  |
  tkNE "ypush tok"   | tkLT "ypush tok"    |
  tkLE "ypush tok"   | tkGE "ypush tok"    |
  tkGT "ypush tok"   | tkMOD "ypush tok"   |
  tkGTGT "ypush tok" | tkLTLT "ypush tok" %

// end
