xref: /netbsd-src/external/bsd/pcc/dist/pcc/f77/fcom/gram.expr (revision 6e0bca226213170693d0d173dd885840754030f8)
1funarglist:
2		{ $$ = 0; }
3	| funargs
4	;
5
6funargs:  expr
7		{ $$ = mkchain($1, 0); }
8	| funargs SCOMMA expr
9		{ $$ = hookup($1, mkchain($3,0) ); }
10	;
11
12
13expr:	  uexpr
14	| SLPAR expr SRPAR	{ $$ = $2; }
15	| complex_const
16	;
17
18uexpr:	  lhs
19	| simple_const
20	| expr addop expr   %prec SPLUS
21		{ $$ = mkexpr($2, $1, $3); }
22	| expr SSTAR expr
23		{ $$ = mkexpr(OPSTAR, $1, $3); }
24	| expr SSLASH expr
25		{ $$ = mkexpr(OPSLASH, $1, $3); }
26	| expr SPOWER expr
27		{ $$ = mkexpr(OPPOWER, $1, $3); }
28	| addop expr  %prec SSTAR
29		{ if($1 == OPMINUS)
30			$$ = mkexpr(OPNEG, $2, 0);
31		  else 	$$ = $2;
32		}
33	| expr relop expr  %prec SEQ
34		{ $$ = mkexpr($2, $1, $3); }
35	| expr SEQV expr
36		{ $$ = mkexpr(OPEQV, $1,$3); }
37	| expr SNEQV expr
38		{ $$ = mkexpr(OPNEQV, $1, $3); }
39	| expr SOR expr
40		{ $$ = mkexpr(OPOR, $1, $3); }
41	| expr SAND expr
42		{ $$ = mkexpr(OPAND, $1, $3); }
43	| SNOT expr
44		{ $$ = mkexpr(OPNOT, $2, 0); }
45	| expr SCONCAT expr
46		{ $$ = mkexpr(OPCONCAT, $1, $3); }
47	;
48
49addop:	  SPLUS		{ $$ = OPPLUS; }
50	| SMINUS	{ $$ = OPMINUS; }
51	;
52
53relop:	  SEQ	{ $$ = OPEQ; }
54	| SGT	{ $$ = OPGT; }
55	| SLT	{ $$ = OPLT; }
56	| SGE	{ $$ = OPGE; }
57	| SLE	{ $$ = OPLE; }
58	| SNE	{ $$ = OPNE; }
59	;
60
61lhs:	 name
62		{ $$ = mkprim($1, 0, 0, 0); }
63	| name SLPAR opt_expr SCOLON opt_expr SRPAR
64		{ $$ = mkprim($1, 0, $3, $5); }
65	| name SLPAR funarglist SRPAR
66		{ $$ = mkprim($1, mklist($3), 0, 0); }
67	| name SLPAR funarglist SRPAR SLPAR opt_expr SCOLON opt_expr SRPAR
68		{ $$ = mkprim($1, mklist($3), $6, $8); }
69	;
70
71opt_expr:
72		{ $$ = 0; }
73	| expr
74	;
75
76simple:	  name
77		{ if($1->vclass == CLPARAM)
78			$$ = cpexpr($1->b_param.paramval);
79		}
80	| simple_const
81	;
82
83simple_const:   STRUE	{ $$ = mklogcon(1); }
84	| SFALSE	{ $$ = mklogcon(0); }
85	| SHOLLERITH  { $$ = mkstrcon(toklen, token); }
86	| SICON	{ $$ = mkintcon( convci(toklen, token) ); }
87	| SRCON	{ $$ = mkrealcon(TYREAL, convcd(toklen, token)); }
88	| SDCON	{ $$ = mkrealcon(TYDREAL, convcd(toklen, token)); }
89	;
90
91complex_const:  SLPAR uexpr SCOMMA uexpr SRPAR
92		{ $$ = mkcxcon($2,$4); }
93	;
94
95bit_const:  SHEXCON
96		{ $$ = mkbitcon(4, toklen, token); }
97	| SOCTCON
98		{ $$ = mkbitcon(3, toklen, token); }
99	| SBITCON
100		{ $$ = mkbitcon(1, toklen, token); }
101	;
102
103fexpr:	  unpar_fexpr
104	| SLPAR fexpr SRPAR
105		{ $$ = $2; }
106	;
107
108unpar_fexpr:	  lhs
109	| simple_const
110	| fexpr addop fexpr   %prec SPLUS
111		{ $$ = mkexpr($2, $1, $3); }
112	| fexpr SSTAR fexpr
113		{ $$ = mkexpr(OPSTAR, $1, $3); }
114	| fexpr SSLASH fexpr
115		{ $$ = mkexpr(OPSLASH, $1, $3); }
116	| fexpr SPOWER fexpr
117		{ $$ = mkexpr(OPPOWER, $1, $3); }
118	| addop fexpr  %prec SSTAR
119		{ if($1 == OPMINUS)
120			$$ = mkexpr(OPNEG, $2, 0);
121		  else	$$ = $2;
122		}
123	| fexpr SCONCAT fexpr
124		{ $$ = mkexpr(OPCONCAT, $1, $3); }
125	;
126