home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2846 < prev    next >
Internet Message Format  |  1991-02-23  |  24KB

  1. From: barnett@grymoire.crd.ge.com (Bruce Barnett)
  2. Newsgroups: alt.sources
  3. Subject: Ease 3.0: High Level Language for Sendmail  (Part 4 of 6)
  4. Message-ID: <BARNETT.91Feb23021720@grymoire.crd.ge.com>
  5. Date: 23 Feb 91 07:17:20 GMT
  6.  
  7. #! /bin/sh
  8. # This is a shell archive.  Remove anything before this line, then unpack
  9. # it by saving it into a file and typing "sh file".  To overwrite existing
  10. # files, type "sh file -c".  You can also feed this as standard input via
  11. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  12. # will see the following message at the end:
  13. #        "End of archive 4 (of 6)."
  14. # Contents:  src/parser.y
  15. # Wrapped by barnett@grymoire on Sat Feb 23 01:13:55 1991
  16. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  17. if test -f src/parser.y -a "${1}" != "-c" ; then 
  18.   echo shar: Will not over-write existing file \"src/parser.y\"
  19. else
  20. echo shar: Extracting \"src/parser.y\" \(21605 characters\)
  21. sed "s/^X//" >src/parser.y <<'END_OF_src/parser.y'
  22. X%{
  23. X#ifdef FLUKE
  24. X# ifndef LINT
  25. X    static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/parser.y,v 3.0 1991/02/22 18:50:27 barnett Exp $";
  26. X# endif LINT
  27. X#endif FLUKE
  28. X
  29. X/*
  30. X *    parser.y -- EASE parser.
  31. X *
  32. X *            Contains code for yacc(1) which produces a parser (y.tab.c)
  33. X *            for Ease, a specification format for sendmail configuration
  34. X *            files.
  35. X *
  36. X *    author   -- James S. Schoner, Purdue University Computing Center,
  37. X *                          West Lafayette, Indiana  47907
  38. X *
  39. X *    date     -- July 2, 1985
  40. X *
  41. X *    Copyright (c) 1985 by Purdue Research Foundation
  42. X *
  43. X *    All rights reserved.
  44. X *
  45. X * $Log: parser.y,v $
  46. X * Revision 3.0  1991/02/22  18:50:27  barnett
  47. X * Added support for HP/UX and IDA sendmail.
  48. X *
  49. X * Revision 2.1  1990/01/30  15:48:35  jeff
  50. X * Added SunOS/Ultrix/IDA extensions  Jan 24, 1989 Bruce Barnett
  51. X *
  52. X * Version 2.0  90/01/30  15:44:34  jeff
  53. X * Baseline release for netwide posting.
  54. X * 
  55. X */
  56. X
  57. X#include "fixstrings.h"
  58. X#include <stdio.h>
  59. X#include "symtab.h"
  60. X#include <ctype.h>
  61. Xextern void       BindID ();
  62. Xextern void       EmitDef ();
  63. Xextern char      *ListAppend ();
  64. Xextern char       *MakeCond ();
  65. Xextern char      *MakeRStr ();
  66. Xextern char       *ConvOpt ();
  67. Xextern char      *ConvFlg ();
  68. Xextern char      *MacScan ();
  69. Xextern char      *ConvMat ();
  70. Xextern void       StartRuleset ();
  71. Xextern char      *MakePosTok ();
  72. Xextern char      *GetField ();
  73. Xextern char      *Bracket ();
  74. Xextern char      *MakeRSCall ();
  75. Xextern char      *CheckMailer ();
  76. Xextern char      *CheckRS ();
  77. Xextern char      *MakeField ();
  78. Xextern char       MakeMac ();
  79. Xextern void       AssignType ();
  80. Xextern void       RemoveSymbol ();
  81. Xextern void       yyerror ();
  82. X
  83. Xextern short RMatch;        /* ruleset match flag               */
  84. X
  85. Xchar *Cbuf = " ";        /* character buffer                 */
  86. Xchar *Mbuf = "$ ";        /* macro buffer                        */
  87. Xchar *Tsb;            /* pointer to temporary string buffer */
  88. Xchar *Tsb1;            /* pointer to another temporary string buffer */
  89. Xchar *Flaglist;            /* pointer to header flag list          */
  90. X
  91. X#define DIM(x)    (sizeof x/sizeof x[0])
  92. Xextern int yychar;
  93. Xextern int    yydebug;
  94. X
  95. Xstatic char *
  96. Xyydisplay(ch)
  97. X     register int ch;
  98. X{
  99. X    static char buf[15];
  100. X    static char * token[] = {
  101. X#include "y.tok.h"
  102. X    0 };
  103. X
  104. X    switch (ch) {
  105. X      case 0:
  106. X    return "[end of file]";
  107. X/* YYERRCODE is 256. See below */
  108. X/*      case YYERRCODE:
  109. X    return "[error]"; */
  110. X      case '\b':
  111. X    return "'\\b'";
  112. X      case '\f':
  113. X    return "'\\f'";
  114. X      case '\n':
  115. X    return "'\\n'";
  116. X      case '\r':
  117. X    return "'\\r'";
  118. X      case '\t':
  119. X    return "'\\t'";
  120. X    }
  121. X    /* I should use YYERRCODE - but it hasn't been defined yet */
  122. X    /* when /usr/lib/yaccpar is added to this file, it will be defined */
  123. X    if (ch == 256 ) return ("[error]"); 
  124. X    if (ch > 256 && ch < 256 + DIM(token))
  125. X      return token[ch - 257];
  126. X    if (isascii(ch) && isprint(ch))
  127. X      sprintf(buf, "'%c'",ch);
  128. X    else if (ch < 256)
  129. X      sprintf(buf, "Char %o4.3o", ch);
  130. X    else 
  131. X      sprintf(buf, "token %d", ch);
  132. X    return buf;
  133. X}
  134. Xstatic yyyylex() 
  135. X{
  136. X    if (yychar < 0) {
  137. X        /* don't make this match =yylex - because sed changes
  138. X           =yylex to =yyyylex in the Makefile. 
  139. X           the pieces it changes is in /usr/lib/yaccparr and I don't
  140. X           want to modify THAT!  - bgb */
  141. X
  142. X        if ((yychar = yylex ()) < 0)    /* call yylex, not yyyylex */
  143. X            yychar = 0;
  144. X#ifdef YYDEBUG
  145. X    if (yydebug)
  146. X        printf("[yydebug] reading %s\n",
  147. X            yydisplay(yychar));
  148. X#endif
  149. X        return yychar;
  150. X    }
  151. X}
  152. X     
  153. X
  154. X%}
  155. X
  156. X%union {            /* value stack element type    */
  157. X    int      ival;        /* integer token            */
  158. X    char      *psb;        /* string token               */
  159. X    struct he *phe;        /* pointer to hash entry       */
  160. X    enum opts optval;    /* sendmail options           */
  161. X    enum flgs flgval;    /* mailer flags               */
  162. X    enum mats mpval;    /* mailer attribute parameters */
  163. X}
  164. X
  165. X%start config
  166. X
  167. X%token     <phe>    IDENT
  168. X%token  <psb>    SCONST
  169. X%token  <ival>    ICONST SEPCHAR
  170. X%token BIND CANON CLASS CONCAT FOR HEADER HOST HOSTNUM IF IFSET IN
  171. X%token MACRO MAILER MAP MARGV MATCH MEOL MFLAGS MMAXSIZE MPATH
  172. X%token MRECIPIENT MSENDER NEXT OPTIONS PRECEDENCE READCLASS RESOLVE
  173. X%token RETRY RETURN RULESET TRUSTED USER
  174. X%token YPALIAS YPMAP YPPASSWD EVAL RESOLVED QUOTE ASM PROGRAM DEFAULT ALIAS
  175. X
  176. X%token ASGN COLON COMMA DEFINE DOLLAR FIELD LBRACE LPAREN RBRACE
  177. X%token RPAREN SEMI STAR SLASH
  178. X
  179. X%token AAOPT AOPT BBOPT CCOPT COPT DDOPT DOPT DOPTB DOPTI DOPTQ EOPT
  180. X%token EOPTE EOPTM EOPTP EOPTW EOPTZ FFOPT FOPT GOPT HHOPT IOPT LLOPT
  181. X%token MOPT NNOPT NOPT OOPT PPOPT QOPT QQOPT ROPT SOPT SSOPT TOPT TTOPT
  182. X%token UOPT VOPT WWOPT XOPT XXOPT YOPT YYOPT ZOPT ZZOPT
  183. X%token RROPT BOPT SLOPT HOPT IIOPT
  184. X
  185. X%token AAFLAG CCFLAG DDFLAG EEFLAG EFLAG FFFLAG FFLAG HFLAG IIFLAG LFLAG
  186. X%token LLFLAG MFLAG MMFLAG NFLAG PFLAG PPFLAG RFLAG RRFLAG SFLAG SSFLAG
  187. X%token UFLAG UUFLAG XFLAG XXFLAG
  188. X%token HHFLAG VVFLAG BBFLAG
  189. X
  190. X%type    <psb>        mval strval ifcon conval ifres elseres nameset namelist
  191. X%type    <psb>        doptid eoptid idlist fcond dlist mflags route mdefs
  192. X%type    <psb>        matchaddr matchtok action actionstmt mailerspec mtdef
  193. X%type    <psb>        rwaddr rwtok ftype reftok rword cantok resolution
  194. X%type    <psb>        userspec hword hostid dheader mdefine
  195. X%type    <psb>        catstring catstringlist canval canvaltok
  196. X%type    <ival>        anychar
  197. X%type    <phe>        cdef
  198. X%type    <optval>    optid
  199. X%type    <flgval>    flagid
  200. X%type    <mpval>        mvar
  201. X
  202. X%left COMMA
  203. X%left LPAREN RPAREN
  204. X%nonassoc SCONST
  205. X
  206. X%%
  207. Xconfig        :    /* empty */
  208. X        |    config blockdef
  209. X        |    error blockdef
  210. X        ;
  211. X
  212. Xblockdef    :    BIND bindings
  213. X        |    MACRO macdefs
  214. X        |    CLASS classdefs
  215. X        |    OPTIONS optdefs
  216. X        |    PRECEDENCE precdefs
  217. X        |    TRUSTED tlist
  218. X        |    HEADER hdefs
  219. X        |    MAILER mlist
  220. X        |    RULESET rdef
  221. X        |    FIELD fdefs
  222. X        ;
  223. X
  224. Xbindings    :    /* empty */
  225. X        |    bindings IDENT ASGN RULESET ICONST SEMI {
  226. X                BindID ($2, $5, ID_RULESET);
  227. X            }
  228. X        |    error SEMI {
  229. X                yyerrok;
  230. X            }
  231. X        ;
  232. X
  233. Xmacdefs        :    /* empty */
  234. X        |    macdefs IDENT ASGN mdefine SEMI {
  235. X                EmitDef (def_macro, $2, $4, (char *) NULL);
  236. X            }
  237. X        |    error SEMI {
  238. X                yyerrok;
  239. X            }
  240. X        ;
  241. X
  242. X/* macro value
  243. X * can be string
  244. X * or ifset()
  245. X * or concat
  246. X */
  247. Xmdefine            :       mval {
  248. X                        $$ = $1;
  249. X            }
  250. X        |    IFSET LPAREN IDENT COMMA ifres RPAREN {
  251. X                $$ = MakeCond ($3, MacScan($5));
  252. X            }
  253. X        ;
  254. Xmval        :    strval                %prec COMMA {
  255. X                $$ = $1;
  256. X            }
  257. X        |    CONCAT LPAREN conval RPAREN {
  258. X                $$ = $3;
  259. X            } 
  260. X        ;
  261. X
  262. Xstrval        :    SCONST {
  263. X                $$ = $1;
  264. X            }
  265. X        |    strval SCONST {
  266. X                $$ = ListAppend ($1, $2, (char *) NULL);
  267. X                free ($1);
  268. X            }
  269. X        ;
  270. X
  271. X/* conval specifies what can be in a concat() function */
  272. Xconval        :    strval COMMA ifcon {
  273. X                $$ = ListAppend ($1, $3, (char *) NULL);
  274. X                free ($1);
  275. X                free ($3);
  276. X            }
  277. X        |    ifcon COMMA strval {
  278. X                $$ = ListAppend ($1, $3, (char *) NULL);
  279. X                free ($1);
  280. X                free ($3);
  281. X            }
  282. X        |    ifcon {
  283. X                $$ = $1;
  284. X            }
  285. X        |    error {
  286. X                $$ = NULL;
  287. X            }
  288. X        ;
  289. X
  290. Xifcon        :    IFSET LPAREN IDENT COMMA ifres RPAREN {
  291. X                $$ = MakeCond ($3, MacScan($5));
  292. X            }
  293. X        ;
  294. X
  295. Xifres        :    mval elseres {
  296. X                if ($2 != NULL) {
  297. X                    $$ = ListAppend ($1, $2, "$|");
  298. X                    free ($1);
  299. X                    free ($2);
  300. X                } else
  301. X                    $$ = $1;
  302. X            }
  303. X        |    error {
  304. X                $$ = NULL;
  305. X            }
  306. X        ;
  307. X
  308. Xelseres        :    /* empty */ {
  309. X                $$ = NULL;
  310. X            }
  311. X        |    COMMA mval {
  312. X                $$ = $2;
  313. X            }
  314. X        ;
  315. X
  316. Xclassdefs    :    /* empty */ 
  317. X        |    classdefs IDENT ASGN nameset {
  318. X                EmitDef (def_class, $2, $4, (char *) NULL);
  319. X            }
  320. X                |     classdefs ASM LPAREN SCONST RPAREN SEMI {
  321. X                printf("%s\n",$4);
  322. X                        }
  323. X        |    error
  324. X        ;
  325. X
  326. Xnameset        :    LBRACE namelist RBRACE SEMI {
  327. X                $$ = $2;
  328. X            }
  329. X        |    LBRACE RBRACE SEMI {
  330. X                $$ = NULL;
  331. X            }
  332. X        |    LBRACE error RBRACE SEMI {
  333. X                $$ = NULL;
  334. X            }
  335. X        |    READCLASS LPAREN strval RPAREN SEMI {
  336. X                $$ = MakeRStr ($3, (char *) NULL);
  337. X            }
  338. X        |    READCLASS LPAREN strval COMMA strval RPAREN SEMI {
  339. X                $$ = MakeRStr ($3, $5);
  340. X            }
  341. X        |    READCLASS LPAREN error RPAREN SEMI {
  342. X                $$ = NULL;
  343. X            }
  344. X        |    error SEMI {
  345. X                $$ = NULL;
  346. X                yyerrok;
  347. X            }
  348. X        ;
  349. X
  350. Xnamelist    :    IDENT {
  351. X                $$ = ListAppend ($1->psb, (char *) NULL, (char *) NULL);
  352. X                RemoveSymbol ($1);
  353. X            }
  354. X        |    strval {
  355. X                $$ = $1;
  356. X            }
  357. X        |    namelist COMMA IDENT {
  358. X                $$ = ListAppend ($1, $3->psb, " ");
  359. X                free ($1);
  360. X                RemoveSymbol ($3);
  361. X            }
  362. X        |    namelist COMMA strval {
  363. X                $$ = ListAppend ($1, $3, " ");
  364. X                free ($1);
  365. X                free ($3);
  366. X            }
  367. X        ;
  368. X
  369. Xoptdefs        :    /* empty */
  370. X        |    optdefs optid ASGN strval SEMI {
  371. X                EmitDef (def_option, (struct he *) NULL, ConvOpt ($2), $4);
  372. X            }
  373. X        |    optdefs DOPT ASGN doptid SEMI {
  374. X                EmitDef (def_option, (struct he *) NULL, ConvOpt (opt_d), $4);
  375. X            }
  376. X        |    optdefs EOPT ASGN eoptid SEMI {
  377. X                EmitDef (def_option, (struct he *) NULL, ConvOpt (opt_e), $4);
  378. X            }
  379. X                |     optdefs ASM LPAREN SCONST RPAREN SEMI {
  380. X                printf("%s\n",$4);
  381. X                        }
  382. X        |    error SEMI {
  383. X                yyerrok;
  384. X            }
  385. X        ;
  386. X
  387. Xoptid        :    AAOPT {
  388. X                $$ = opt_A;
  389. X            }
  390. X        |    AOPT {
  391. X                $$ = opt_a;
  392. X            }
  393. X        |    BBOPT {
  394. X                $$ = opt_B;
  395. X            }
  396. X        |    BOPT {
  397. X                $$ = opt_b;
  398. X            }
  399. X        |    CCOPT {
  400. X                $$ = opt_C;
  401. X            }
  402. X        |    COPT {
  403. X                $$ = opt_c;
  404. X            }
  405. X        |    DDOPT {
  406. X                $$ = opt_D;
  407. X            }
  408. X        |    FFOPT {
  409. X                $$ = opt_F;
  410. X            }
  411. X        |    FOPT {
  412. X                $$ = opt_f;
  413. X            }
  414. X        |    GOPT {
  415. X                $$ = opt_g;
  416. X            }
  417. X        |    HOPT {
  418. X                $$ = opt_h;
  419. X            }
  420. X        |    HHOPT {
  421. X                $$ = opt_H;
  422. X            }
  423. X        |    IOPT {
  424. X                $$ = opt_i;
  425. X            }
  426. X        |    IIOPT {
  427. X                $$ = opt_I;
  428. X            }
  429. X        |    LLOPT {
  430. X                $$ = opt_L;
  431. X            }
  432. X        |    MOPT {
  433. X                $$ = opt_m;
  434. X            }
  435. X        |    NNOPT {
  436. X                $$ = opt_N;
  437. X            }
  438. X        |    NOPT {
  439. X                $$ = opt_n;
  440. X            }
  441. X        |    PPOPT {
  442. X                $$ = opt_P;
  443. X            }
  444. X        |    OOPT {
  445. X                $$ = opt_o;
  446. X            }
  447. X        |    QQOPT {
  448. X                $$ = opt_Q;
  449. X            }
  450. X        |    QOPT {
  451. X                $$ = opt_q;
  452. X            }
  453. X        |    ROPT {
  454. X                $$ = opt_r;
  455. X            }
  456. X        |    RROPT {
  457. X                $$ = opt_R;
  458. X            }
  459. X        |    SSOPT {
  460. X                $$ = opt_S;
  461. X            }
  462. X        |    SOPT {
  463. X                $$ = opt_s;
  464. X            }
  465. X        |    TTOPT {
  466. X                $$ = opt_T;
  467. X            }
  468. X        |    TOPT {
  469. X                $$ = opt_t;
  470. X            }
  471. X        |    UOPT {
  472. X                $$ = opt_u;
  473. X            }
  474. X        |    VOPT {
  475. X                $$ = opt_v;
  476. X            }
  477. X        |    WWOPT {
  478. X                $$ = opt_W;
  479. X            }
  480. X        |    XOPT {
  481. X                $$ = opt_x;
  482. X            }
  483. X        |    XXOPT {
  484. X                $$ = opt_X;
  485. X            }
  486. X        |    YOPT {
  487. X                $$ = opt_y;
  488. X            }
  489. X        |    YYOPT {
  490. X                $$ = opt_Y;
  491. X            }
  492. X        |    ZOPT {
  493. X                $$ = opt_z;
  494. X            }
  495. X        |    ZZOPT {
  496. X                $$ = opt_Z;
  497. X            }
  498. X        |    SLOPT {
  499. X                $$ = opt_SL;    /* SLASH .e.g. O/ in IDA */
  500. X            }
  501. X        ;
  502. X
  503. Xdoptid        :    DOPTI {
  504. X                $$ = ConvOpt (d_opt_i);
  505. X            }
  506. X        |    DOPTB {
  507. X                $$ = ConvOpt (d_opt_b);
  508. X            }
  509. X        |    DOPTQ {
  510. X                $$ = ConvOpt (d_opt_q);
  511. X            }
  512. X        ;
  513. X
  514. Xeoptid        :    EOPTP {
  515. X                $$ = ConvOpt (e_opt_p);
  516. X            }
  517. X        |    EOPTE {
  518. X                $$ = ConvOpt (e_opt_e);
  519. X            }
  520. X        |    EOPTM {
  521. X                $$ = ConvOpt (e_opt_m);
  522. X            }
  523. X        |    EOPTW {
  524. X                $$ = ConvOpt (e_opt_w);
  525. X            }
  526. X        |    EOPTZ {
  527. X                $$ = ConvOpt (e_opt_z);
  528. X            }
  529. X        ;
  530. X
  531. Xprecdefs    :    /* empty */
  532. X        |    precdefs IDENT ASGN ICONST SEMI {
  533. X                BindID ($2, $4, ID_PREC);
  534. X                EmitDef (def_prec, $2, (char *) NULL, (char *) NULL);
  535. X            }
  536. X        ;
  537. X
  538. Xtlist        :    /* empty */
  539. X        |    tlist LBRACE IDENT idlist RBRACE SEMI {
  540. X                EmitDef (def_trusted, (struct he *) NULL, 
  541. X                     ListAppend ($3->psb, $4, " "), (char *) NULL);
  542. X                free ($4);
  543. X                RemoveSymbol ($3);
  544. X            }
  545. X        |    tlist LBRACE RBRACE SEMI
  546. X        |    error SEMI {
  547. X                yyerrok;
  548. X            }
  549. X        ;
  550. X
  551. Xhdefs        :    /* empty */
  552. X        |    hdefs FOR fcond dheader SEMI {
  553. X                EmitDef (def_header, (struct he *) NULL, $3, $4);
  554. X            }
  555. X        |    hdefs FOR fcond LBRACE { Flaglist = $3; } 
  556. X                dheaders RBRACE SEMI
  557. X        |    hdefs DEFINE dlist SEMI {
  558. X                EmitDef (def_header, (struct he *) NULL, (char *) NULL, $3);
  559. X            }
  560. X        |    error SEMI {
  561. X                yyerrok;
  562. X            }
  563. X        ;
  564. X
  565. Xfcond        :    LPAREN RPAREN {
  566. X                $$ = NULL;
  567. X            }
  568. X        |    LPAREN mflags RPAREN {
  569. X                $$ = $2;
  570. X            }
  571. X        |    LPAREN error RPAREN {
  572. X                $$ = NULL;
  573. X            }
  574. X        ;
  575. X
  576. Xmflags        :    flagid {
  577. X                $$ = ListAppend (ConvFlg ($1), (char *) NULL, (char *) NULL);
  578. X            }
  579. X        |    mflags COMMA flagid {
  580. X                $$ = ListAppend ($1, ConvFlg($3), (char *) NULL);
  581. X                free ($1);
  582. X            }
  583. X        ;
  584. X
  585. Xflagid        :    FFLAG {
  586. X                $$ = flg_f;
  587. X            }
  588. X        |    RFLAG {
  589. X                $$ = flg_r;
  590. X            }
  591. X        |    SSFLAG {
  592. X                $$ = flg_S;
  593. X            }
  594. X        |    NFLAG {
  595. X                $$ = flg_n;
  596. X            }
  597. X        |    LFLAG {
  598. X                $$ = flg_l;
  599. X            }
  600. X        |    SFLAG {
  601. X                $$ = flg_s;
  602. X            }
  603. X        |    MFLAG {
  604. X                $$ = flg_m;
  605. X            }
  606. X        |    FFFLAG {
  607. X                $$ = flg_F;
  608. X            }
  609. X        |    DDFLAG {
  610. X                $$ = flg_D;
  611. X            }
  612. X        |    MMFLAG {
  613. X                $$ = flg_M;
  614. X            }
  615. X        |    XFLAG {
  616. X                $$ = flg_x;
  617. X            }
  618. X        |    PPFLAG {
  619. X                $$ = flg_P;
  620. X            }
  621. X        |    UFLAG {
  622. X                $$ = flg_u;
  623. X            }
  624. X        |    HFLAG {
  625. X                $$ = flg_h;
  626. X            }
  627. X        |    AAFLAG {
  628. X                $$ = flg_A;
  629. X            }
  630. X        |    BBFLAG {
  631. X                $$ = flg_B;
  632. X            }
  633. X        |    UUFLAG {
  634. X                $$ = flg_U;
  635. X            }
  636. X        |    EFLAG {
  637. X                $$ = flg_e;
  638. X            }
  639. X        |    XXFLAG {
  640. X                $$ = flg_X;
  641. X            }
  642. X        |    LLFLAG {
  643. X                $$ = flg_L;
  644. X            }
  645. X        |    PFLAG {
  646. X                $$ = flg_p;
  647. X            }
  648. X        |    IIFLAG {
  649. X                $$ = flg_I;
  650. X            }
  651. X        |    CCFLAG {
  652. X                $$ = flg_C;
  653. X            }
  654. X        |    EEFLAG {
  655. X                $$ = flg_E;
  656. X            }
  657. X        |    RRFLAG {
  658. X                $$ = flg_R;
  659. X            }
  660. X        |    HHFLAG {
  661. X                $$ = flg_H;
  662. X            }
  663. X        |    VVFLAG {
  664. X                $$ = flg_V;
  665. X            }
  666. X        ;
  667. X
  668. Xdheader        :    /* empty */ {
  669. X                $$ = NULL;
  670. X            }
  671. X        |    DEFINE dlist {
  672. X                $$ = $2;
  673. X            }
  674. X        |    error {
  675. X                $$ = NULL;
  676. X            }
  677. X        ;
  678. X
  679. Xdheaders    :    /* empty */
  680. X        |    dheaders DEFINE dlist SEMI {
  681. X                EmitDef (def_header, (struct he *) NULL, Flaglist, $3);
  682. X            }
  683. X                |     dheaders ASM LPAREN SCONST RPAREN SEMI {
  684. X                printf("%s\n",$4);
  685. X                        }
  686. X        |    error
  687. X        ;
  688. X
  689. Xdlist        :    LPAREN strval COMMA catstringlist RPAREN {
  690. X                $$ = ListAppend ($2, MacScan ($4), " ");
  691. X                free ($2);
  692. X                free ($4);
  693. X            }
  694. X        |    LPAREN error RPAREN {
  695. X                $$ = NULL;
  696. X            }
  697. X        ;
  698. X
  699. Xcatstringlist    :    catstring {
  700. X                  $$ = $1;
  701. X            }
  702. X        |    catstring COMMA catstringlist {
  703. X                  $$ = ListAppend( $1, $3, (char *) NULL);
  704. X                  free($1);
  705. X            }
  706. Xcatstring    :    SCONST {
  707. X                $$ = $1;
  708. X            }
  709. X        |    CONCAT LPAREN conval RPAREN {
  710. X                $$ = $3;
  711. X            }
  712. X        |    ifcon {
  713. X                $$ = $1;
  714. X            }
  715. X        ;
  716. X
  717. Xmlist        :    /* empty */
  718. X        |    mlist IDENT LBRACE mdefs RBRACE SEMI {
  719. X                EmitDef (def_mailer, $2, $4, (char *) NULL);
  720. X            }
  721. X        |    mlist IDENT LBRACE RBRACE SEMI {
  722. X                EmitDef (def_mailer, $2, (char *) NULL, (char *) NULL);
  723. X            }
  724. X        |    error SEMI {
  725. X                yyerrok;
  726. X            }
  727. X        ;
  728. X
  729. Xmdefs        :    mtdef {
  730. X                $$ = $1;
  731. X            }
  732. X        |    mdefs COMMA mtdef {
  733. X                $$ = ListAppend ($1, $3, ", ");
  734. X                free ($1);
  735. X                free ($3);
  736. X            }
  737. X        ;    
  738. X
  739. Xmtdef        :    mvar ASGN mval {
  740. X                $$ = ListAppend (ConvMat ($1), MacScan ($3), "=");
  741. X                free ($3);
  742. X            }
  743. X        |    MFLAGS ASGN LBRACE mflags RBRACE {
  744. X                $$ = ListAppend (ConvMat (mat_flags), $4, "=");
  745. X            }
  746. X        |    MSENDER ASGN IDENT {
  747. X                $$ = ListAppend (ConvMat (mat_sender), CheckRS ($3), "=");
  748. X            }
  749. X        |    MSENDER ASGN IDENT SLASH IDENT {
  750. X                $$ = ListAppend(
  751. X                 Tsb = ListAppend (ConvMat(mat_sender), CheckRS ($3), "="),
  752. X                 Tsb1 = ListAppend ("/", CheckRS ($5), (char *) NULL),
  753. X                         (char *) NULL);
  754. X                free (Tsb);
  755. X                free (Tsb1);
  756. X            }
  757. X        |    MRECIPIENT ASGN IDENT {
  758. X                $$ = ListAppend (ConvMat (mat_recipient), CheckRS ($3), "=");
  759. X            }
  760. X        |    MRECIPIENT ASGN IDENT SLASH IDENT {
  761. X                $$ = ListAppend(
  762. X                 Tsb = ListAppend (ConvMat(mat_recipient), CheckRS ($3), "="),
  763. X                 Tsb1 = ListAppend ("/", CheckRS ($5), (char *) NULL),
  764. X                         (char *) NULL);
  765. X                free (Tsb);
  766. X                free (Tsb1);
  767. X            }
  768. X        |    error {
  769. X                $$ = NULL;
  770. X            }
  771. X        ;
  772. X
  773. Xmvar        :    MPATH {
  774. X                $$ = mat_path;
  775. X            }
  776. X        |    MARGV {
  777. X                $$ = mat_argv;
  778. X            }
  779. X        |    MEOL {
  780. X                $$ = mat_eol;
  781. X            }
  782. X        |    MMAXSIZE {
  783. X                $$ = mat_maxsize;
  784. X            }
  785. X        ;
  786. X
  787. Xrdef        :    /* empty */
  788. X        |    rdef IDENT { StartRuleset ($2); } rulelist
  789. X        ;
  790. X
  791. Xrulelist    :    LBRACE ruledefs RBRACE {
  792. X                RMatch = FALSE;
  793. X            }
  794. X        |    error {
  795. X                RMatch = FALSE;
  796. X            }
  797. X        ;
  798. X
  799. Xruledefs    :    /* empty */ {
  800. X                RMatch = TRUE;
  801. X            }
  802. X        |    ruledefs IF LPAREN matchaddr RPAREN actionstmt {
  803. X                EmitDef (def_ruleset, (struct he *) NULL, 
  804. X                     ListAppend ($4, $6, "\t"), (char *) NULL);
  805. X            free ($4);
  806. X            free ($6);
  807. X            }
  808. X                |     ruledefs ASM LPAREN SCONST RPAREN SEMI {
  809. X                  printf("%s\n",$4);
  810. X                        }
  811. X        |    error SEMI {
  812. X                yyerrok;
  813. X            }
  814. X        ;
  815. X
  816. Xmatchaddr    :    /* empty */ {
  817. X                $$ = NULL;
  818. X            }
  819. X        |    matchaddr matchtok {
  820. X                $$ = ListAppend ($1, $2, (char *) NULL);
  821. X                free ($1);
  822. X            }
  823. X        |    error {
  824. X                $$ = NULL;
  825. X            }
  826. X        ;
  827. X
  828. Xmatchtok    :    IDENT {
  829. X                $$ = GetField ($1);
  830. X            }
  831. X        |    anychar {
  832. X                *Cbuf = $1;
  833. X                $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
  834. X            }
  835. X        |    mval {
  836. X                $$ = MacScan ($1);
  837. X            }
  838. X        |    DOLLAR IDENT {
  839. X                Mbuf[1] = MakeMac ($2, ID_MACRO);
  840. X                $$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
  841. X            }
  842. X                |       YPALIAS LPAREN matchtok RPAREN {
  843. X                 $$ = ListAppend("${",$3,(char *) NULL);
  844. X/*             free ($3); */
  845. X        }
  846. X                |       YPPASSWD LPAREN matchtok RPAREN {
  847. X                 $$ = ListAppend("$\"",$3,(char *) NULL);
  848. X        }
  849. X                |       RESOLVED LPAREN matchtok RPAREN {
  850. X                 $$ = ListAppend("$#",$3,(char *) NULL);
  851. X        }
  852. X    ;
  853. X
  854. Xactionstmt    :    action LPAREN rwaddr RPAREN SEMI {
  855. X                $$ = ListAppend ($1, $3, (char *) NULL);
  856. X                free ($3);
  857. X            }
  858. X        |    RESOLVE LPAREN resolution RPAREN SEMI {
  859. X                $$ = $3;
  860. X            }
  861. X        |    error SEMI {
  862. X                $$ = NULL;
  863. X                yyerrok;
  864. X            }
  865. X        ;
  866. X
  867. Xaction        :    RETRY {
  868. X                $$ = NULL;
  869. X            }
  870. X        |    NEXT {
  871. X                $$ = "$:";
  872. X            }
  873. X        |    RETURN {
  874. X                $$ = "$@";
  875. X            }
  876. X        ;
  877. X
  878. Xrwaddr        :    /* empty */ {
  879. X                $$ = NULL;
  880. X            }
  881. X        |    rwaddr rwtok {
  882. X                $$ = ListAppend ($1, $2, (char *) NULL);
  883. X                free ($1);
  884. X            }
  885. X        |    rwaddr IDENT LPAREN rwaddr RPAREN {
  886. X                $$ = ListAppend ($1, (Tsb = MakeRSCall ($2, $4)), (char *) NULL);
  887. X                free ($1);
  888. X                free ($4);
  889. X                free (Tsb);
  890. X            }
  891. X        |    error {
  892. X                $$ = NULL;
  893. X            }
  894. X        ;
  895. X
  896. Xrwtok        :    anychar {
  897. X                *Cbuf = $1;
  898. X                $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
  899. X            }
  900. X        |    mval {
  901. X                $$ = MacScan ($1);
  902. X            }
  903. X        |    cantok {
  904. X                $$ = $1;
  905. X            }
  906. X        |    ALIAS LPAREN reftok  RPAREN {
  907. X                $$ = ListAppend("$(@", $3, "$:$)");
  908. X            }
  909. X        |    ALIAS LPAREN reftok DEFAULT LPAREN rwaddr RPAREN RPAREN {
  910. X                $$ = ListAppend(Tsb = 
  911. X                        ListAppend ( "$(@", 
  912. X                                $3, 
  913. X                                (char *)NULL),
  914. X                        Tsb1 = ListAppend("$:", $6, "$)" ),
  915. X                        (char *) NULL);
  916. X                free (Tsb);
  917. X                free (Tsb1);
  918. X                free ($3);
  919. X                free ($6);
  920. X            }
  921. X        |    reftok {
  922. X                $$ = $1;
  923. X            }
  924. X        |    ifcon {
  925. X                $$ = $1;
  926. X            }
  927. X                |    YPMAP LPAREN IDENT COMMA rwaddr RPAREN {
  928. X                *Cbuf = MakeMac ($3, ID_MACRO);
  929. X                $$ = ListAppend(Tsb = ListAppend ("${", (char *)Cbuf, (char *)NULL),
  930. X                        Tsb1 = ListAppend ($5, "$}", (char *) NULL),
  931. X                         (char *) NULL);
  932. X                free (Tsb);
  933. X                free (Tsb1);
  934. X                free ($5);
  935. X            }
  936. X
  937. X                |    PROGRAM LPAREN IDENT COMMA rwaddr RPAREN {
  938. X                *Cbuf = MakeMac ($3, ID_MACRO);
  939. X                $$ = ListAppend(Tsb = ListAppend ("$<", (char *)Cbuf, (char *)NULL),
  940. X                        Tsb1 = ListAppend ($5, "", (char *) NULL),
  941. X                         (char *) NULL);
  942. X                free (Tsb);
  943. X                free (Tsb1);
  944. X                free ($5);
  945. X            }
  946. X
  947. X                |    action LPAREN rwaddr RPAREN {
  948. X                $$ = ListAppend ($1, $3, (char *) NULL);
  949. X                free ($3);
  950. X            }
  951. X        ;
  952. X
  953. X
  954. Xcantok        :    CANON LPAREN canval RPAREN {
  955. X                $$ = Bracket ($3, TRUE);
  956. X                free ($3);
  957. X            }
  958. X
  959. X                ;
  960. Xcanval        :    canvaltok {
  961. X                $$ = $1;
  962. X            }
  963. X        |    canval canvaltok {
  964. X                $$ = ListAppend ($1, $2, (char *) NULL);
  965. X                free ($1);
  966. X                free ($2);
  967. X            }
  968. X        ;
  969. X
  970. Xcanvaltok    :    IDENT {
  971. X                $$ = ListAppend ($1->psb, (char *) NULL, (char *) NULL);
  972. X                RemoveSymbol ($1);
  973. X            }
  974. X        |    SCONST {
  975. X                $$ = ListAppend (MacScan ($1), (char *) NULL, (char *) NULL);
  976. X                free ($1);
  977. X            }
  978. X                |    NEXT LPAREN RPAREN {    /* I Used next earlier, but now use default - because it is clearer syntax */
  979. X                $$ = "$:";
  980. X            }
  981. X                |    NEXT LPAREN canval RPAREN {
  982. X                $$ = ListAppend("$:", $3, (char *)NULL);
  983. X            }
  984. X                |    DEFAULT LPAREN RPAREN {
  985. X                $$ = "$:";
  986. X            }
  987. X                |    DEFAULT LPAREN canval RPAREN {
  988. X                $$ = ListAppend("$:", $3, (char *)NULL);
  989. X            }
  990. X        |    reftok {
  991. X                $$ = $1;
  992. X            }
  993. X        |    SEPCHAR {
  994. X                *Cbuf = $1;
  995. X                $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
  996. X            }
  997. X        |    HOSTNUM LPAREN reftok RPAREN {
  998. X                $$ = Bracket ($3, FALSE);
  999. X                free ($3);
  1000. X            }
  1001. X        ;
  1002. X
  1003. Xreftok        :    DOLLAR IDENT {
  1004. X                Mbuf[1] = MakeMac ($2, ID_MACRO);
  1005. X                $$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
  1006. X            }
  1007. X        |    DOLLAR ICONST {
  1008. X                $$ = ListAppend (MakePosTok ($2), (char *) NULL, (char *) NULL);
  1009. X            }
  1010. X                |    EVAL LPAREN IDENT RPAREN {
  1011. X                *Cbuf = MakeMac ($3, ID_MACRO);
  1012. X                $$ = ListAppend("$&", (char *)Cbuf, (char *)NULL);
  1013. X            }
  1014. X        ;
  1015. X
  1016. Xanychar        :    SEPCHAR {
  1017. X                $$ = $1;
  1018. X            }
  1019. X        |    COLON {
  1020. X                $$ = ':';
  1021. X            }
  1022. X        |    STAR {
  1023. X                $$ = '*';
  1024. X            }
  1025. X        |    SEMI {
  1026. X                $$ = ';';
  1027. X            }
  1028. X        |    LBRACE {
  1029. X                $$ = '{';
  1030. X            }
  1031. X        |    RBRACE {
  1032. X                $$ = '}';
  1033. X            }
  1034. X        |    COMMA {
  1035. X                $$ = ',';
  1036. X            }
  1037. X        |    SLASH {
  1038. X                $$ = '/';
  1039. X            }
  1040. X        |    ASGN {
  1041. X                $$ = '=';
  1042. X            }
  1043. X        ;
  1044. X
  1045. Xresolution    :    mailerspec COMMA route {
  1046. X                $$ = ListAppend ($1, $3, (char *) NULL);
  1047. X                free ($1);
  1048. X                free ($3);
  1049. X            }
  1050. X        |    mailerspec {
  1051. X            $$ = $1;
  1052. X            }
  1053. X        |    error {
  1054. X                $$ = NULL;
  1055. X            }
  1056. X        ;
  1057. X
  1058. Xmailerspec    :    MAILER LPAREN rword RPAREN {
  1059. X                $$ = ListAppend ("$#", $3, (char *) NULL);
  1060. X            }
  1061. X        ;
  1062. X
  1063. Xroute        :    HOST LPAREN hword RPAREN COMMA userspec {
  1064. X                $$ = ListAppend (Tsb = ListAppend ("$@", $3, (char *) NULL),
  1065. X                         $6, (char *) NULL);
  1066. X                free (Tsb);
  1067. X
  1068. X
  1069. X                free ($6);
  1070. X            }
  1071. X        |    userspec {
  1072. X                $$ = $1;
  1073. X            }
  1074. X        ;
  1075. X
  1076. Xhword        :    hostid {
  1077. X                $$ = $1;
  1078. X            }
  1079. X        |    HOSTNUM LPAREN reftok RPAREN {
  1080. X                $$ = Bracket ($3, FALSE);
  1081. X                free ($3);
  1082. X            }
  1083. X        ;
  1084. X
  1085. Xhostid        :    /* empty */ {
  1086. X                $$ = NULL;
  1087. X            }
  1088. X        |    hostid IDENT {
  1089. X                $$ = ListAppend ($1, $2->psb, (char *) NULL);
  1090. X                RemoveSymbol ($2);
  1091. X                free ($1);
  1092. X            }
  1093. X        |    hostid rwtok {
  1094. X                $$ = ListAppend ($1, $2, (char *) NULL);
  1095. X                free ($1);
  1096. X            }
  1097. X        ;
  1098. X
  1099. Xuserspec    :    USER LPAREN rwaddr RPAREN {
  1100. X                $$ = ListAppend ("$:", $3, (char *) NULL);
  1101. X                free ($3);
  1102. X            }
  1103. X        ;
  1104. X
  1105. Xrword        :    IDENT {
  1106. X                $$ = CheckMailer ($1);
  1107. X            }
  1108. X        |    reftok {
  1109. X                $$ = $1;
  1110. X            }
  1111. X        ;
  1112. X
  1113. Xfdefs        :    /* empty */
  1114. X        |    fdefs IDENT idlist COLON ftype SEMI {
  1115. X                AssignType (ListAppend ($2->psb, $3, " "), $5);
  1116. X                free ($3);
  1117. X            }
  1118. X        |    error SEMI {
  1119. X                yyerrok;
  1120. X            }
  1121. X        ;
  1122. X
  1123. Xidlist        :    /* empty */ {
  1124. X                $$ = NULL;
  1125. X            }
  1126. X        |    idlist COMMA IDENT {
  1127. X                $$ = ListAppend ($1, $3->psb, " ");
  1128. X                free ($1);
  1129. X            }
  1130. X        ;
  1131. X
  1132. Xftype        :    MATCH LPAREN ICONST RPAREN cdef {
  1133. X                $$ = ListAppend (MakeField ($3, $5, FALSE, FALSE), 
  1134. X                             (char *) NULL, (char *) NULL);
  1135. X            }
  1136. X        |    MATCH LPAREN ICONST RPAREN MAP IDENT {
  1137. X                $$ = ListAppend (MakeField ($3, $6, FALSE, TRUE), 
  1138. X                             (char *) NULL, (char *) NULL);
  1139. X            }
  1140. X        |    MATCH HOST {
  1141. X                $$ = ListAppend ("$%y", 
  1142. X                             (char *) NULL, (char *) NULL);
  1143. X            }
  1144. X        |    MATCH LPAREN ICONST STAR RPAREN {
  1145. X                $$ = ListAppend (MakeField ($3, (struct he *) NULL, TRUE, FALSE), 
  1146. X                         (char *) NULL, (char *) NULL);
  1147. X            }
  1148. X        |    error {
  1149. X                $$ = NULL;
  1150. X            }
  1151. X        ;
  1152. X
  1153. Xcdef        :    /* empty */ {
  1154. X                $$ = NULL;
  1155. X            }
  1156. X        |    IN IDENT {
  1157. X                $$ = $2;
  1158. X            }
  1159. X        ;
  1160. END_OF_src/parser.y
  1161. if test 21605 -ne `wc -c <src/parser.y`; then
  1162.     echo shar: \"src/parser.y\" unpacked with wrong size!
  1163. fi
  1164. # end of overwriting check
  1165. fi
  1166. echo shar: End of archive 4 \(of 6\).
  1167. cp /dev/null ark4isdone
  1168. MISSING=""
  1169. for I in 1 2 3 4 5 6 ; do
  1170.     if test ! -f ark${I}isdone ; then
  1171.     MISSING="${MISSING} ${I}"
  1172.     fi
  1173. done
  1174. if test "${MISSING}" = "" ; then
  1175.     echo You have unpacked all 6 archives.
  1176.     rm -f ark[1-9]isdone
  1177. else
  1178.     echo You still need to unpack the following archives:
  1179.     echo "        " ${MISSING}
  1180. fi
  1181. ##  End of shell archive.
  1182. exit 0
  1183. --
  1184. Bruce G. Barnett    barnett@crd.ge.com    uunet!crdgw1!barnett
  1185.