BSD 4 release
[unix-history] / usr / src / cmd / f77 / gram.expr
CommitLineData
853979d9
BJ
1funarglist:
2 { $$ = 0; }
3 | funargs
4 ;
5
6funargs: expr
7 { $$ = mkchain($1, CHNULL); }
8 | funargs SCOMMA expr
9 { $$ = hookup($1, mkchain($3,CHNULL) ); }
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, ENULL);
31 else $$ = $2;
32 }
33 | expr relop expr %prec SEQ
34 { $$ = mkexpr($2, $1, $3); }
35 | expr SEQV expr
36 { NO66(".EQV. operator");
37 $$ = mkexpr(OPEQV, $1,$3); }
38 | expr SNEQV expr
39 { NO66(".NEQV. operator");
40 $$ = mkexpr(OPNEQV, $1, $3); }
41 | expr SOR expr
42 { $$ = mkexpr(OPOR, $1, $3); }
43 | expr SAND expr
44 { $$ = mkexpr(OPAND, $1, $3); }
45 | SNOT expr
46 { $$ = mkexpr(OPNOT, $2, ENULL); }
47 | expr SCONCAT expr
48 { NO66("concatenation operator //");
49 $$ = mkexpr(OPCONCAT, $1, $3); }
50 ;
51
52addop: SPLUS { $$ = OPPLUS; }
53 | SMINUS { $$ = OPMINUS; }
54 ;
55
56relop: SEQ { $$ = OPEQ; }
57 | SGT { $$ = OPGT; }
58 | SLT { $$ = OPLT; }
59 | SGE { $$ = OPGE; }
60 | SLE { $$ = OPLE; }
61 | SNE { $$ = OPNE; }
62 ;
63
64lhs: name
65 { $$ = mkprim($1, PNULL, CHNULL); }
66 | name substring
67 { NO66("substring operator :");
68 $$ = mkprim($1, PNULL, $2); }
69 | name SLPAR funarglist SRPAR
70 { $$ = mkprim($1, mklist($3), CHNULL); }
71 | name SLPAR funarglist SRPAR substring
72 { NO66("substring operator :");
73 $$ = mkprim($1, mklist($3), $5); }
74 ;
75
76substring: SLPAR opt_expr SCOLON opt_expr SRPAR
77 { $$ = mkchain($2, mkchain($4,CHNULL)); }
78 ;
79
80opt_expr:
81 { $$ = 0; }
82 | expr
83 ;
84
85simple: name
86 { if($1->vclass == CLPARAM)
87 $$ = (expptr) cpexpr(
88 ( (struct Paramblock *) ($1) ) -> paramval);
89 }
90 | simple_const
91 ;
92
93simple_const: STRUE { $$ = mklogcon(1); }
94 | SFALSE { $$ = mklogcon(0); }
95 | SHOLLERITH { $$ = mkstrcon(toklen, token); }
96 | SICON = { $$ = mkintcon( convci(toklen, token) ); }
97 | SRCON = { $$ = mkrealcon(TYREAL, convcd(toklen, token)); }
98 | SDCON = { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); }
99 ;
100
101complex_const: SLPAR uexpr SCOMMA uexpr SRPAR
102 { $$ = mkcxcon($2,$4); }
103 ;
104
105bit_const: SHEXCON
106 { NOEXT("hex constant");
107 $$ = mkbitcon(4, toklen, token); }
108 | SOCTCON
109 { NOEXT("octal constant");
110 $$ = mkbitcon(3, toklen, token); }
111 | SBITCON
112 { NOEXT("binary constant");
113 $$ = mkbitcon(1, toklen, token); }
114 ;
115
116fexpr: unpar_fexpr
117 | SLPAR fexpr SRPAR
118 { $$ = $2; }
119 ;
120
121unpar_fexpr: lhs
122 | simple_const
123 | fexpr addop fexpr %prec SPLUS
124 { $$ = mkexpr($2, $1, $3); }
125 | fexpr SSTAR fexpr
126 { $$ = mkexpr(OPSTAR, $1, $3); }
127 | fexpr SSLASH fexpr
128 { $$ = mkexpr(OPSLASH, $1, $3); }
129 | fexpr SPOWER fexpr
130 { $$ = mkexpr(OPPOWER, $1, $3); }
131 | addop fexpr %prec SSTAR
132 { if($1 == OPMINUS)
133 $$ = mkexpr(OPNEG, $2, ENULL);
134 else $$ = $2;
135 }
136 | fexpr SCONCAT fexpr
137 { NO66("concatenation operator //");
138 $$ = mkexpr(OPCONCAT, $1, $3); }
139 ;