home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / src / h / grammar.h < prev    next >
Text File  |  2001-12-12  |  8KB  |  274 lines

  1. /*
  2.  * grammar.h -- Yacc grammar for Icon
  3.  *
  4.  * This file is combined with other files to make the Yacc input for
  5.  * building icont, iconc, and variant translators.
  6.  *
  7.  * Any modifications to this grammar will require corresponding changes to
  8.  * parserr.h, icont/tgrammar.c, iconc/cgrammar.c, and vtran/vtfiles/ident.c.
  9.  */
  10.  
  11. program    : decls EOFX {Progend($1,$2);} ;
  12.  
  13. decls    : ;
  14.     | decls decl ;
  15.  
  16. decl    : record {Recdcl($1);} ;
  17.     | proc {Procdcl($1);} ;
  18.     | global {Globdcl($1);} ;
  19.     | link {Linkdcl($1);} ;
  20.         | invocable {Invocdcl($1);} ;
  21.  
  22. invocable : INVOCABLE invoclist {Invocable($1, $2);} ;
  23.  
  24. invoclist : invocop;
  25.       | invoclist COMMA invocop {Invoclist($1,$2,$3);} ;
  26.  
  27. invocop  : IDENT {Invocop1($1);} ;
  28.      | STRINGLIT {Invocop2($1);} ;
  29.      | STRINGLIT COLON INTLIT {Invocop3($1,$2,$3);} ;
  30.  
  31. link    : LINK lnklist {Link($1, $2);} ;
  32.  
  33. lnklist    : lnkfile ;
  34.     | lnklist COMMA lnkfile {Lnklist($1,$2,$3);} ;
  35.  
  36. lnkfile    : IDENT {Lnkfile1($1);} ;
  37.     | STRINGLIT {Lnkfile2($1);} ;
  38.  
  39. global    : GLOBAL {Global0($1);} idlist  {Global1($1, $2, $3);} ;
  40.  
  41. record    : RECORD IDENT {Record1($1,$2);} LPAREN fldlist RPAREN {
  42.         Record2($1,$2,$3,$4,$5,$6);
  43.         } ;
  44.  
  45. fldlist    : {Arglist1();} ;
  46.     | idlist {Arglist2($1);} ;
  47.  
  48. proc    : prochead SEMICOL locals initial procbody END {
  49.         Proc1($1,$2,$3,$4,$5,$6);
  50.         } ;
  51.  
  52. prochead: PROCEDURE IDENT {Prochead1($1,$2);} LPAREN arglist RPAREN {
  53.         Prochead2($1,$2,$3,$4,$5,$6);
  54.         } ;
  55.  
  56. arglist    : {Arglist1();} ;
  57.     | idlist {Arglist2($1);} ;
  58.     | idlist LBRACK RBRACK {Arglist3($1,$2,$3);} ;
  59.  
  60.  
  61. idlist    : IDENT {
  62.         Ident($1);
  63.         } ;
  64.     | idlist COMMA IDENT {
  65.         Idlist($1,$2,$3);
  66.         } ;
  67.  
  68. locals    : {Locals1();} ;
  69.     | locals retention idlist SEMICOL {Locals2($1,$2,$3,$4);} ;
  70.  
  71. retention: LOCAL {Local($1);} ;
  72.     | STATIC {Static($1);} ;
  73.  
  74. initial    : {Initial1();} ;
  75.     | INITIAL expr SEMICOL {Initial2($1,$2,$3);} ;
  76.  
  77. procbody: {Procbody1();} ;
  78.     | nexpr SEMICOL procbody {Procbody2($1,$2,$3);} ;
  79.  
  80. nexpr    : {Nexpr();} ;
  81.     | expr ;
  82.  
  83. expr    : expr1a ;
  84.     | expr AND expr1a    {Bamper($1,$2,$3);} ;
  85.  
  86. expr1a    : expr1 ;
  87.     | expr1a QMARK expr1    {Bques($1,$2,$3);} ;
  88.  
  89. expr1    : expr2 ;
  90.     | expr2 SWAP expr1 {Bswap($1,$2,$3);} ;
  91.     | expr2 ASSIGN expr1 {Bassgn($1,$2,$3);} ;
  92.     | expr2 REVSWAP expr1 {Brswap($1,$2,$3);} ;
  93.     | expr2 REVASSIGN expr1 {Brassgn($1,$2,$3);} ;
  94.     | expr2 AUGCONCAT expr1 {Baugcat($1,$2,$3);} ;
  95.     | expr2 AUGLCONCAT expr1 {Bauglcat($1,$2,$3);} ;
  96.     | expr2 AUGDIFF expr1 {Bdiffa($1,$2,$3);} ;
  97.     | expr2 AUGUNION expr1 {Buniona($1,$2,$3);} ;
  98.     | expr2 AUGPLUS expr1 {Bplusa($1,$2,$3);} ;
  99.     | expr2 AUGMINUS expr1 {Bminusa($1,$2,$3);} ;
  100.     | expr2 AUGSTAR expr1 {Bstara($1,$2,$3);} ;
  101.     | expr2 AUGINTER expr1 {Bintera($1,$2,$3);} ;
  102.     | expr2 AUGSLASH expr1 {Bslasha($1,$2,$3);} ;
  103.     | expr2 AUGMOD expr1 {Bmoda($1,$2,$3);} ;
  104.     | expr2 AUGCARET expr1 {Bcareta($1,$2,$3);} ;
  105.     | expr2 AUGNMEQ expr1 {Baugeq($1,$2,$3);} ;
  106.     | expr2 AUGEQUIV expr1 {Baugeqv($1,$2,$3);} ;
  107.     | expr2 AUGNMGE expr1 {Baugge($1,$2,$3);} ;
  108.     | expr2 AUGNMGT expr1 {Bauggt($1,$2,$3);} ;
  109.     | expr2 AUGNMLE expr1 {Baugle($1,$2,$3);} ;
  110.     | expr2 AUGNMLT expr1 {Bauglt($1,$2,$3);} ;
  111.     | expr2 AUGNMNE expr1 {Baugne($1,$2,$3);} ;
  112.     | expr2 AUGNEQUIV expr1 {Baugneqv($1,$2,$3);} ;
  113.     | expr2 AUGSEQ expr1 {Baugseq($1,$2,$3);} ;
  114.     | expr2 AUGSGE expr1 {Baugsge($1,$2,$3);} ;
  115.     | expr2 AUGSGT expr1 {Baugsgt($1,$2,$3);} ;
  116.     | expr2 AUGSLE expr1 {Baugsle($1,$2,$3);} ;
  117.     | expr2 AUGSLT expr1 {Baugslt($1,$2,$3);} ;
  118.     | expr2 AUGSNE expr1 {Baugsne($1,$2,$3);} ;
  119.     | expr2 AUGQMARK expr1 {Baugques($1,$2,$3);} ;
  120.     | expr2 AUGAND expr1 {Baugamper($1,$2,$3);} ;
  121.     | expr2 AUGAT expr1 {Baugact($1,$2,$3);} ;
  122.  
  123. expr2    : expr3 ;
  124.     | expr2 TO expr3 {To0($1,$2,$3);} ;
  125.     | expr2 TO expr3 BY expr3 {To1($1,$2,$3,$4,$5);} ;
  126.  
  127. expr3    : expr4 ;
  128.     | expr4 BAR expr3 {Alt($1,$2,$3);} ;
  129.  
  130. expr4    : expr5 ;
  131.     | expr4 SEQ expr5 {Bseq($1,$2,$3);} ;
  132.     | expr4 SGE expr5 {Bsge($1,$2,$3);} ;
  133.     | expr4 SGT expr5 {Bsgt($1,$2,$3);} ;
  134.     | expr4 SLE expr5 {Bsle($1,$2,$3);} ;
  135.     | expr4 SLT expr5 {Bslt($1,$2,$3);} ;
  136.     | expr4 SNE expr5 {Bsne($1,$2,$3);} ;
  137.     | expr4 NMEQ expr5 {Beq($1,$2,$3);} ;
  138.     | expr4 NMGE expr5 {Bge($1,$2,$3);} ;
  139.     | expr4 NMGT expr5 {Bgt($1,$2,$3);} ;
  140.     | expr4 NMLE expr5 {Ble($1,$2,$3);} ;
  141.     | expr4 NMLT expr5 {Blt($1,$2,$3);} ;
  142.     | expr4 NMNE expr5 {Bne($1,$2,$3);} ;
  143.     | expr4 EQUIV expr5 {Beqv($1,$2,$3);} ;
  144.     | expr4 NEQUIV expr5 {Bneqv($1,$2,$3);} ;
  145.  
  146. expr5    : expr6 ;
  147.     | expr5 CONCAT expr6 {Bcat($1,$2,$3);} ;
  148.     | expr5 LCONCAT expr6 {Blcat($1,$2,$3);} ;
  149.  
  150. expr6    : expr7 ;
  151.     | expr6 PLUS expr7 {Bplus($1,$2,$3);} ;
  152.     | expr6 DIFF expr7 {Bdiff($1,$2,$3);} ;
  153.     | expr6 UNION expr7 {Bunion($1,$2,$3);} ;
  154.     | expr6 MINUS expr7 {Bminus($1,$2,$3);} ;
  155.  
  156. expr7    : expr8 ;
  157.     | expr7 STAR expr8 {Bstar($1,$2,$3);} ;
  158.     | expr7 INTER expr8 {Binter($1,$2,$3);} ;
  159.     | expr7 SLASH expr8 {Bslash($1,$2,$3);} ;
  160.     | expr7 MOD expr8 {Bmod($1,$2,$3);} ;
  161.  
  162. expr8    : expr9 ;
  163.     | expr9 CARET expr8 {Bcaret($1,$2,$3);} ;
  164.  
  165. expr9    : expr10 ;
  166.     | expr9 BACKSLASH expr10 {Blim($1,$2,$3);} ;
  167.     | expr9 AT expr10 {Bact($1,$2,$3);};
  168.     | expr9 BANG expr10 {Apply($1,$2,$3);};
  169.  
  170. expr10    : expr11 ;
  171.     | AT expr10 {Uat($1,$2);} ;
  172.     | NOT expr10 {Unot($1,$2);} ;
  173.     | BAR expr10 {Ubar($1,$2);} ;
  174.     | CONCAT expr10 {Uconcat($1,$2);} ;
  175.     | LCONCAT expr10 {Ulconcat($1,$2);} ;
  176.     | DOT expr10 {Udot($1,$2);} ;
  177.     | BANG expr10 {Ubang($1,$2);} ;
  178.     | DIFF expr10 {Udiff($1,$2);} ;
  179.     | PLUS expr10 {Uplus($1,$2);} ;
  180.     | STAR expr10 {Ustar($1,$2);} ;
  181.     | SLASH expr10 {Uslash($1,$2);} ;
  182.     | CARET expr10 {Ucaret($1,$2);} ;
  183.     | INTER expr10 {Uinter($1,$2);} ;
  184.     | TILDE expr10 {Utilde($1,$2);} ;
  185.     | MINUS expr10 {Uminus($1,$2);} ;
  186.     | NMEQ expr10 {Unumeq($1,$2);} ;
  187.     | NMNE expr10 {Unumne($1,$2);} ;
  188.     | SEQ expr10 {Ulexeq($1,$2);} ;
  189.     | SNE expr10 {Ulexne($1,$2);} ;
  190.     | EQUIV expr10 {Uequiv($1,$2);} ;
  191.     | UNION expr10 {Uunion($1,$2);} ;
  192.     | QMARK expr10 {Uqmark($1,$2);} ;
  193.     | NEQUIV expr10 {Unotequiv($1,$2);} ;
  194.     | BACKSLASH expr10 {Ubackslash($1,$2);} ;
  195.  
  196. expr11    : literal ;
  197.     | section ;
  198.     | return ;
  199.     | if ;
  200.     | case ;
  201.     | while ;
  202.     | until ;
  203.     | every ;
  204.     | repeat ;
  205.     | CREATE expr {Create($1,$2);} ;
  206.     | IDENT {Var($1);} ;
  207.     | NEXT {Next($1);} ;
  208.     | BREAK nexpr {Break($1,$2);} ;
  209.     | LPAREN exprlist RPAREN {Paren($1,$2,$3);} ;
  210.     | LBRACE compound RBRACE {Brace($1,$2,$3);} ;
  211.     | LBRACK exprlist RBRACK {Brack($1,$2,$3);} ;
  212.     | expr11 LBRACK exprlist RBRACK {Subscript($1,$2,$3,$4);} ;
  213.     | expr11 LBRACE    RBRACE {Pdco0($1,$2,$3);} ;
  214.     | expr11 LBRACE pdcolist RBRACE {Pdco1($1,$2,$3,$4);} ;
  215.     | expr11 LPAREN exprlist RPAREN {Invoke($1,$2,$3,$4);} ;
  216.     | expr11 DOT IDENT {Field($1,$2,$3);} ;
  217.     | AND FAIL {Kfail($1,$2);} ;
  218.     | AND IDENT {Keyword($1,$2);} ;
  219.  
  220. while    : WHILE expr {While0($1,$2);} ;
  221.     | WHILE expr DO expr {While1($1,$2,$3,$4);} ;
  222.  
  223. until    : UNTIL expr {Until0($1,$2);} ;
  224.     | UNTIL expr DO expr {Until1($1,$2,$3,$4);} ;
  225.  
  226. every    : EVERY expr {Every0($1,$2);} ;
  227.     | EVERY expr DO expr {Every1($1,$2,$3,$4);} ;
  228.  
  229. repeat    : REPEAT expr {Repeat($1,$2);} ;
  230.  
  231. return    : FAIL {Fail($1);} ;
  232.     | RETURN nexpr {Return($1,$2);} ;
  233.     | SUSPEND nexpr {Suspend0($1,$2);} ;
  234.         | SUSPEND expr DO expr {Suspend1($1,$2,$3,$4);};
  235.  
  236. if    : IF expr THEN expr {If0($1,$2,$3,$4);} ;
  237.     | IF expr THEN expr ELSE expr {If1($1,$2,$3,$4,$5,$6);} ;
  238.  
  239. case    : CASE expr OF LBRACE caselist RBRACE {Case($1,$2,$3,$4,$5,$6);} ;
  240.  
  241. caselist: cclause ;
  242.     | caselist SEMICOL cclause {Caselist($1,$2,$3);} ;
  243.  
  244. cclause    : DEFAULT COLON expr {Cclause0($1,$2,$3);} ;
  245.     | expr COLON expr {Cclause1($1,$2,$3);} ;
  246.  
  247. exprlist: nexpr                {Elst0($1);}
  248.     | exprlist COMMA nexpr {Elst1($1,$2,$3);} ;
  249.  
  250. pdcolist: nexpr {
  251.         Pdcolist0($1);
  252.         } ;
  253.     | pdcolist COMMA nexpr {
  254.         Pdcolist1($1,$2,$3);
  255.         } ;
  256.  
  257. literal    : INTLIT {Iliter($1);} ;
  258.     | REALLIT {Rliter($1);} ;
  259.     | STRINGLIT {Sliter($1);} ;
  260.     | CSETLIT {Cliter($1);} ;
  261.  
  262. section    : expr11 LBRACK expr sectop expr RBRACK {Section($1,$2,$3,$4,$5,$6);} ;
  263.  
  264. sectop    : COLON {Colon($1);} ;
  265.     | PCOLON {Pcolon($1);} ;
  266.     | MCOLON {Mcolon($1);} ;
  267.  
  268. compound: nexpr ;
  269.     | nexpr SEMICOL compound {Compound($1,$2,$3);} ;
  270.  
  271. program    : error decls EOFX ;
  272. proc    : prochead error procbody END ;
  273. expr    : error ;
  274.