// Som grammar for LL(1) parser 11 Jan 2004
// modify to rid type from lex (no tkIDnew etc)
// use only tkIDEN         20 Jan 2004
// add macro                 24 Feb 2005

$ /* parser Som-C generated from parse.txt 24 Feb 2005 */

$ #include "compile.h"
$ #include "parse.h"
$ extern int lv, tok, nenum;
$ extern int exas();

top -> tkTO fundef | tkCOLON macro | ex #
fundef ->
  tkIDEN $setfname(tyFUNC); args $setarity(); tkEQ ex $dofun(tkTO); #
macro ->
  tkIDEN $setfname(tyMAC); args $setarity(); tkEQ ex $dofun(tkCOLON); #
args ->	tkIDEN $enterLocal(tokstring); args |
  tkBAR $ypush(lv); local | $ypush(lv); nil #
local -> tkIDEN $enterLocal(tokstring); 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 $dolocal(); ex0 ex0 ex $dofor(); |
  tkCASE ex0 tkBB $ypush(MARK); caselist tkBE $docase(); |
  tkENUM tkBB elist tkBE $ypush(NIL); |
  tkBREAK $ypush(newatom(OPER,tkBREAK)); |
  exas #

//  originally :  (modify 11 Nov 2004)
//  exas ex0 $doset(); |
//  ex0 #

exelse -> tkELSE ex $ypush(MARK); | nil #
elist -> tkNUMBER $nenum=atoi(tokstring); elist2 | elist2 #
elist2 -> tkIDEN $doenum(); elist2 | nil #
caselist ->
  tkNUMBER $donum(atoi(tokstring)); tkCOLON ex caselist |
  tkIDEN $dolabel(); tkCOLON ex caselist |
  tkELSE $donum(-1); tkCOLON ex |
  nil #

ex0 -> term terms #
terms [ tk ] -> $tk=tok; bop term $dobop(tk); terms | nil #
term [ a ] ->
  tkNUMBER $donum(atoi(tokstring)); |
  tkSTRING $dostring(tokstring); |
  tkIDEN $a=search(tokstring); $doiden(a); |
  tkNOT ex0 $douop(tkNOT); |
  tkARRAY ex0 $douop(tkARRAY); |
  tkSYSCALL tuple $dosys(); |
  tkLPAREN ex0 tkRPAREN #

tuple -> 
  tkBB tkNUMBER $ypush(MARK);donum(atoi(tokstring)); tuples tkBE #
tuples -> ex0 tuples | nil #

mod -> tkLBRACKET ex0 tkRBRACKET $dovec(); | nil #

bop ->
  tkPLUS | tkMINUS | tkSTAR | tkSLASH |
  tkAND | tkBAR | tkCARET | tkEQEQ |
  tkNE | tkLT | tkLE | tkGE |
  tkGT | tkMOD | tkGTGT | tkLTLT #

END
