BSD 4_3 development
[unix-history] / usr / src / usr.bin / efl / gram.head
CommitLineData
832026c6
C
1%{
2#include "defs"
3ptr bgnexec(), addexec(), bgnproc(), mkvar(), mkcomm(), mkstruct(), mkarrow();
4ptr mkiost(), mkioitem(), mkiogroup(), mkformat();
5ptr funcinv(), extrfield(), typexpr(), strucelt(), mkfield();
6ptr esizeof(), elenof(), mkilab();
7ptr ifthen(), doloop();
8struct varblock *subscript();
9%}
10
11%start graal
12%union { int ival; ptr pval; char *cval; }
13
14%left COLON
15%left COMMA
16%right ASGNOP /* = +- -= ... */
17%right REPOP /* $ */
18%left OR /* | || */
19%left AND /* & && */
20%left NOT
21%nonassoc RELOP /* LT GT LE GE EQ NE */
22%left ADDOP /* + - */
23%left MULTOP /* * / */
24%right POWER /* ** ^ */
25%left ARROW QUALOP /* -> . */
26
27%type <pval> dcl stat exec stats proc args arg varname comname structname
28%type <pval> dcl1 dcls1 dcl dcls specs equivlist attrs attr comclass
29%type <pval> dim dimbound bounds bound ubound vars varlist var
30%type <pval> specarray spec deftype struct
31%type <pval> expr lhs parexprs iostat sizeof lengthof lhs1 lhsname exprlist
32%type <pval> beginexec control until lablist parlablist compgotoindex
33%type <pval> do exprnull fortest iostat iounit iolist ioitem iobrace
34%type <pval> format
35%type <ival> stype sclass prec logcon logval brk blocktype letter iokwd label
36%token <pval> CONST OPTNAME COMNAME STRUCTNAME NAME ESCAPE
37%token <ival> RELOP ASGNOP OR AND NOT ADDOP MULTOP POWER DOUBLEADDOP
38%token <ival> LETTER TRUE FALSE
39
40%{
41extern int prevv;
42extern YYSTYPE prevl;
43ptr p;
44ptr procattrs;
45int i,n;
46static int imptype;
47static int ininit =NO;
48
49%}
50
51%%
52
53
54graal:
55 { graal = PARSEOF; }
56 | option endchunk
57 { graal = PARSOPT; }
58 | dcl endchunk
59 { graal = PARSDCL; doinits($1); frchain( & $1); }
60 | procst EOS stats end
61 { endproc(); graal = PARSPROC; }
62 | define endchunk
63 { graal = PARSDEF; }
64 | exec endchunk
65 { graal = PARSERR; }
66 | error
67 { graal = PARSERR;
68 errmess("Syntax error", "", "");
69 }
70 ;
71
72endchunk: EOS { eofneed = 1; }
73
74stat: dcl EOS
75 { if(!dclsect)
76 warn("declaration amid executables");
77 $$ = bgnexec();
78 TEST fprintf(diagfile,"stat: dcl\n");
79 doinits($1); frchain( & $1); }
80 | exec EOS
81 { if(dclsect && $1->tag!=TSTFUNCT)
82 dclsect = 0;
83 TEST fprintf(diagfile, "stat: exec\n"); }
84 | define EOS
85 { $$ = bgnexec(); }
86 | error EOS
87 { yyerrok;
88 errmess("Syntax error", "", "");
89 $$ = bgnexec();
90 }
91 ;
92
93stats:
94 { $$ = bgnexec(); }
95 | stats { thisexec->copylab = 1; } stat
96 { $$ = addexec(); thisexec->copylab = 0; }
97 ;
98
99procst: oproc
100 { procname = 0; thisargs = 0;
101 if(procclass == 0) procclass = PRMAIN;
102 goto proctype;
103 }
104 | oproc procname
105 { thisargs = 0; goto proctype; }
106 | oproc procname LPAR RPAR
107 { thisargs = 0; goto proctype; }
108 | oproc procname LPAR args RPAR
109 { thisargs = $4;
110 proctype:
111 if(procattrs)
112 if(procname == 0)
113 dclerr("attributes on unnamed procedure", "");
114 else {
115 attvars(procattrs, mkchain(procname,CHNULL));
116 procclass = PRFUNCT;
117 }
118 fprintf(diagfile, "Procedure %s:\n", procnm() );
119 if(verbose)
120 fprintf(diagfile, " Pass 1\n");
121 }
122 ;
123
124procname: NAME
125 { procname = mkvar($1);
126 extname(procname);
127 }
128 ;
129
130oproc: proc
131 { procattrs = 0; }
132 | attrs proc
133 { procattrs = $1;
134 if(procclass == 0) procclass = PRFUNCT;
135 }
136 ;
137
138proc: PROCEDURE
139 { $$ = bgnproc(); procclass = 0; }
140 | BLOCKDATA
141 { $$ = bgnproc(); procclass = PRBLOCK; }
142 ;
143
144args: arg
145 { $$ = mkchain($1,CHNULL); }
146 | args COMMA arg
147 { hookup($1, mkchain($3,CHNULL) ); }
148 ;
149
150arg: varname
151 { if($1->vclass == CLUNDEFINED)
152 $1->vclass = CLARG;
153 else dclerr("argument already used", $1->sthead->namep);
154 }
155 ;
156
157option: optson optionnames { optneed = 0; }
158 ;
159
160optson: OPTION
161 { if(blklevel > 0)
162 {
163 execerr("Option statement inside procedure", "");
164 execerr("procedure %s terminated prematurely", procnm());
165 endproc();
166 }
167 optneed = 1;
168 }
169 ;
170
171optionnames:
172 | optionnames optelt
173 | optionnames optelt COMMA
174 ;
175
176optelt: OPTNAME
177 { setopt($1,CNULL); cfree($1); }
178 | OPTNAME ASGNOP OPTNAME
179 { setopt($1,$3); cfree($1); cfree($3); }
180 | OPTNAME ASGNOP CONST
181 { setopt($1,$3->leftp); cfree($1); cfree($3); }
182 ;
183
184
185define: DEFINE { defneed = 1; }
186 ;
187
188end: END
189 { if(thisctl->subtype != STPROC)
190 execerr("control stack not empty upon END", "");
191 exnull();
192 popctl();
193 }
194 ;
195
196contnu:
197 { igeol=1; /* continue past newlines */ }
198 ;