more fix on Ec/Ev.
[gss-tcad.git] / src / cmd / parser.y
blob69b3466fdd08b311f5d81ce1af6f6eaf2cb2ceca
1 %{
3 #include <stdio.h>
4 #include <string.h>
5 #include "cmdbuf.h"
7 extern int yylineno;
8 extern int yylex();
9 int yyerror(list<Cmd> & cmd_list, const char *s);
11 /* define global variable needed by yyparse here*/
12 Arg arg;
13 Cmd cmd;
15 void ClearCmd(Cmd &cmd);
18 /*#define DEBUG*/
22 %start inputfile
24 %union{
25 bool bval;
26 int ival;
27 double dval;
28 char sval[32];
31 %parse-param { list<Cmd> & cmd_list }
33 %token <sval> ASSIGN KEYWORD BOOL_PARAMETER REAL_PARAMETER INT_PARAMETER STRING_PARAMETER
34 %token <ival> INT_NUMBER
35 %token <dval> REAL_NUMBER
36 %token <sval> STRING
37 %token <ival> BLANK COMMENT BAD_WORD
38 %token <bval> BOOL
40 %type <dval> real_expr
41 %type <ival> int_expr
42 %left '+' '-'
43 %left '*' '/'
46 inputfile
47 : command
49 | inputfile command
53 command
54 : ASSIGN STRING '=' real_expr
56 #ifdef DEBUG
57 printf("line %d: --YACC assign --\n",yylineno-1);
58 #endif
59 arg.arg_label=$2;
60 arg.arg_type=DOUBLE;
61 arg.arg_value.dval=$4;
62 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
63 cmd.KeyWord=$1;
64 cmd.lineno = yylineno-1;
65 cmd_list.push_back(cmd);
66 ClearCmd(cmd);
68 | KEYWORD
70 #ifdef DEBUG
71 printf("line %d: --YACC command %s--\n",yylineno-1,$1);
72 #endif
73 cmd.KeyWord=$1;
74 cmd.lineno = yylineno-1;
75 cmd_list.push_back(cmd);
76 ClearCmd(cmd);
78 | KEYWORD parameter
80 #ifdef DEBUG
81 printf("line %d: --YACC command %s--\n",yylineno-1,$1);
82 #endif
83 cmd.KeyWord=$1;
84 cmd.lineno = yylineno-1;
85 cmd_list.push_back(cmd);
86 ClearCmd(cmd);
88 | COMMENT
89 | BLANK
94 real_expr: REAL_NUMBER
95 | INT_NUMBER
96 { $$=$1;}
97 | STRING {
98 int flag=0;
99 double assign_value;
100 list<Cmd>::iterator pcmd;
101 for(pcmd=cmd_list.begin();pcmd!=cmd_list.end();pcmd++)
102 if(!strcmp(pcmd->KeyWord.c_str(),"ASSIGN"))
104 ARG_MAP::iterator parg;
105 if((parg=pcmd->arg_map.find($1))!=pcmd->arg_map.end())
107 assign_value=parg->second.arg_value.dval;
108 flag=1;
111 if(flag)
112 $$=assign_value;
113 else
114 return yyerror(cmd_list, $1);
116 | '(' real_expr ')'
117 { $$=$2;}
118 | real_expr '+' real_expr
119 {$$=$1+$3;}
120 | real_expr '-' real_expr
121 {$$=$1-$3;}
122 | real_expr '*' real_expr
123 {$$=$1*$3;}
124 | real_expr '/' real_expr
125 {$$=$1/$3;}
126 | '-' real_expr %prec '*'
127 {$$=-$2;}
130 int_expr : INT_NUMBER
131 { $$=$1;}
132 | '(' int_expr ')'
133 { $$=$2;}
134 | int_expr '+' int_expr
135 {$$=$1+$3;}
136 | int_expr '-' int_expr
137 {$$=$1-$3;}
138 | int_expr '*' int_expr
139 {$$=$1*$3;}
140 | int_expr '/' int_expr
141 {$$=$1/$3;}
142 | '-' int_expr %prec '*'
143 {$$=-$2;}
146 parameter
147 : parameter REAL_PARAMETER '=' real_expr
149 #ifdef DEBUG
150 printf("--PARAMETER ASSIGN REAL--\n");
151 #endif
152 arg.arg_label=$2;
153 arg.arg_type=DOUBLE;
154 arg.arg_value.dval=$4;
155 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
157 | REAL_PARAMETER '=' real_expr
159 #ifdef DEBUG
160 printf("--PARAMETER ASSIGN REAL--\n");
161 #endif
162 arg.arg_label=$1;
163 arg.arg_type=DOUBLE;
164 arg.arg_value.dval=$3;
165 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
167 | parameter INT_PARAMETER '=' int_expr
169 #ifdef DEBUG
170 printf("--PARAMETER ASSIGN INT--\n");
171 #endif
172 arg.arg_label=$2;
173 arg.arg_type=INTERGER;
174 arg.arg_value.ival=$4;
175 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
177 | INT_PARAMETER '=' int_expr
179 #ifdef DEBUG
180 printf("--PARAMETER ASSIGN INT--\n");
181 #endif
182 arg.arg_label=$1;
183 arg.arg_type=INTERGER;
184 arg.arg_value.ival=$3;
185 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
187 | parameter STRING_PARAMETER '=' STRING
189 #ifdef DEBUG
190 printf("--PARAMETER ASSIGN STRING--\n");
191 #endif
192 arg.arg_label=$2;
193 arg.arg_type=CHARS;
194 strcpy(arg.arg_value.sval,$4);
195 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
197 | STRING_PARAMETER '=' STRING
199 #ifdef DEBUG
200 printf("--PARAMETER ASSIGN STRING--\n");
201 #endif
202 arg.arg_label=$1;
203 arg.arg_type=CHARS;
204 strcpy(arg.arg_value.sval,$3);
205 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
207 | parameter STRING_PARAMETER
209 #ifdef DEBUG
210 printf("--PARAMETER ASSIGN EMPTY STRING--\n");
211 #endif
212 // in this case, assign an empty string
213 arg.arg_label=$2;
214 arg.arg_type=CHARS;
215 strcpy(arg.arg_value.sval,"");
216 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
218 | STRING_PARAMETER
220 #ifdef DEBUG
221 printf("--PARAMETER ASSIGN EMPTY STRING--\n");
222 #endif
223 // in this case, assign an empty string
224 arg.arg_label=$1;
225 arg.arg_type=CHARS;
226 strcpy(arg.arg_value.sval,"");
227 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
229 | parameter BOOL_PARAMETER '=' BOOL
231 #ifdef DEBUG
232 printf("--PARAMETER ASSIGN BOOL--\n");
233 #endif
234 arg.arg_label=$2;
235 arg.arg_type=BOOLVAR;
236 arg.arg_value.bval=$4;
237 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
239 | BOOL_PARAMETER '=' BOOL
241 #ifdef DEBUG
242 printf("--PARAMETER ASSIGN BOOL--\n");
243 #endif
244 arg.arg_label=$1;
245 arg.arg_type=BOOLVAR;
246 arg.arg_value.bval=$3;
247 cmd.arg_map.insert(pair<const string, Arg>(arg.arg_label,arg));
255 int yyerror(list<Cmd> & cmd_list, const char *s)
257 printf("\nYACC report: line %d unrecognized word(s), %s.\n",yylineno,s);
258 return 1;
261 void ClearCmd(Cmd &cmd)
263 cmd.KeyWord.clear();
264 cmd.arg_map.clear();