annotate Plugins/Visualization/paranormal/pn/pnscriptparser.y @ 1717:837983bac90f trunk

[svn] Fixed a lot of warnings that only showed up on *BSD.
author js
date Sat, 16 Sep 2006 16:26:54 -0700
parents 0c5fdcf3f947
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
1 %{
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
2 #define yymaxdepth pn_script_parser_maxdepth
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
3 #define yyparse pn_script_parser_parse
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
4 #define yylex pn_script_parser_lex
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
5 #define yyerror pn_script_parser_error
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
6 #define yylval pn_script_parser_lval
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
7 #define yychar pn_script_parser_char
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
8 #define yydebug pn_script_parser_debug
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
9 #define yypact pn_script_parser_pact
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
10 #define yyr1 pn_script_parser_r1
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
11 #define yyr2 pn_script_parser_r2
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
12 #define yydef pn_script_parser_def
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
13 #define yychk pn_script_parser_chk
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
14 #define yypgo pn_script_parser_pgo
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
15 #define yyact pn_script_parser_act
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
16 #define yyexca pn_script_parser_exca
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
17 #define yyerrflag pn_script_parser_errflag
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
18 #define ynerrs pn_script_parser_nerrs
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
19 #define yyps pn_script_parser_ps
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
20 #define yypv pn_script_parser_pv
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
21 #define yys pn_script_parser_s
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
22 #define yy_yys pn_script_parser_yys
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
23 #define yystate pn_script_parser_state
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
24 #define yytmp pn_script_parser_tmp
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
25 #define yyv pn_script_parser_v
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
26 #define yy_yyv pn_script_parser_yyv
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
27 #define yyval pn_script_parser_val
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
28 #define yylloc pn_script_parser_lloc
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
29 #define yyreds pn_script_parser_reds
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
30 #define yytoks pn_script_parser_toks
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
31 #define yylhs pn_script_parser_yylhs
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
32 #define yylen pn_script_parser_yylen
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
33 #define yydefred pn_script_parser_yydefred
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
34 #define yydgoto pn_script_parser_yydgoto
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
35 #define yysindex pn_script_parser_yysindex
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
36 #define yyrindex pn_script_parser_yyrindex
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
37 #define yygindex pn_script_parser_yygindex
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
38 #define yytable pn_script_parser_yytable
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
39 #define yycheck pn_script_parser_yycheck
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
40 #define yyname pn_script_parser_yyname
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
41 #define yyrule pn_script_parser_yyrule
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
42
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
43 #include <ctype.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
44 #include <stdlib.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
45 #include <glib.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
46 #include <pn/pnscript.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
47
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
48 /* define this to dump the parser output to stdout */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
49 /* #define PN_PRINT_OPS 1 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
50
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
51 int yyerror (char *s);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
52 int yylex (void);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
53
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
54 static gboolean parse_failed;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
55
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
56 /* Are we on the size-determining pass? */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
57 static gboolean size_pass;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
58
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
59 /* Used during the size pass to determine the size of the constant table */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
60 static GArray *temp_constant_table = NULL;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
61
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
62 /* The code size */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
63 static guint code_size;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
64
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
65 /* The current code byte */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
66 static guint *code_ptr;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
67
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
68 /* Input variables used during parsing */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
69 static PnScript *parse_script;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
70 static const gchar *parse_string;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
71 %}
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
72
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
73 %union {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
74 gdouble *constant;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
75 PnVariable *variable;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
76 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
77
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
78 %token <constant> CONSTANT
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
79 %token <variable> VARIABLE
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
80 /* Functions */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
81 %token ABS_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
82 %token MAX_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
83 %token MIN_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
84 %token SIN_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
85 %token COS_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
86 %token TAN_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
87 %token ASIN_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
88 %token ACOS_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
89 %token ATAN_FUNC
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
90
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
91
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
92 %right '='
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
93 %left '-' '+'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
94 %left '*' '/'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
95 %left NEG
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
96 %right '^'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
97
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
98 %%
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
99
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
100 script
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
101 : /* empty */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
102 | script statement
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
103 ;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
104
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
105 statement
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
106 : equation ';'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
107 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
108 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
109 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
110 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
111 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
112 *code_ptr++ = PN_OP_POP;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
113
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
114 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
115 g_print ("POP\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
116 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
117 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
118 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
119 ;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
120
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
121 equation
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
122 : VARIABLE '=' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
123 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
124 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
125 code_size += sizeof (guint) + sizeof (gdouble *);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
126 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
127 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
128 *code_ptr++ = PN_OP_SET;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
129 *code_ptr++ = (guint) $1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
130
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
131 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
132 g_print ("SET %s\n", $1->name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
133 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
134 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
135 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
136
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
137 expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
138 : CONSTANT
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
139 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
140 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
141 code_size += sizeof (guint) + sizeof (gdouble *);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
142 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
143 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
144 *code_ptr++ = PN_OP_PUSHC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
145 *code_ptr++ = GPOINTER_TO_UINT ($1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
146
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
147 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
148 g_print ("PUSHC %f\n", *$1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
149 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
150 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
151 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
152 | VARIABLE
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
153 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
154 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
155 code_size += sizeof (guint) + sizeof (gdouble *);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
156 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
157 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
158 *code_ptr++ = PN_OP_PUSHV;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
159 *code_ptr++ = (guint) $1;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
160
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
161 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
162 g_print ("PUSHV %s\n", $1->name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
163 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
164 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
165 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
166 | equation
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
167 | ABS_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
168 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
169 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
170 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
171 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
172 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
173 *code_ptr++ = PN_OP_ABS;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
174 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
175 g_print ("ABS\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
176 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
177 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
178 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
179 | MAX_FUNC '(' expression ',' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
180 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
181 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
182 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
183 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
184 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
185 *code_ptr++ = PN_OP_MAX;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
186 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
187 g_print ("MAX\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
188 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
189 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
190 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
191 | MIN_FUNC '(' expression ',' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
192 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
193 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
194 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
195 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
196 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
197 *code_ptr++ = PN_OP_MIN;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
198
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
199 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
200 g_print ("MIN\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
201 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
202 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
203
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
204 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
205 | SIN_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
206 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
207 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
208 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
209 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
210 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
211 *code_ptr++ = PN_OP_SIN;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
212
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
213 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
214 g_print ("SIN\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
215 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
216 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
217
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
218 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
219 | COS_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
220 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
221 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
222 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
223 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
224 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
225 *code_ptr++ = PN_OP_COS;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
226
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
227 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
228 g_print ("COS\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
229 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
230 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
231
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
232 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
233 | TAN_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
234 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
235 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
236 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
237 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
238 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
239 *code_ptr++ = PN_OP_TAN;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
240
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
241 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
242 g_print ("TAN\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
243 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
244 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
245
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
246 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
247 | ASIN_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
248 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
249 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
250 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
251 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
252 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
253 *code_ptr++ = PN_OP_ASIN;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
254
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
255 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
256 g_print ("ASIN\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
257 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
258 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
259
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
260 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
261 | ACOS_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
262 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
263 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
264 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
265 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
266 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
267 *code_ptr++ = PN_OP_ACOS;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
268
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
269 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
270 g_print ("ACOS\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
271 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
272 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
273
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
274 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
275 | ATAN_FUNC '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
276 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
277 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
278 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
279 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
280 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
281 *code_ptr++ = PN_OP_ATAN;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
282
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
283 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
284 g_print ("ATAN\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
285 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
286 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
287
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
288 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
289 | expression '+' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
290 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
291 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
292 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
293 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
294 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
295 *code_ptr++ = PN_OP_ADD;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
296
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
297 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
298 g_print ("ADD\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
299 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
300 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
301 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
302 | expression '-' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
303 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
304 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
305 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
306 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
307 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
308 *code_ptr++ = PN_OP_SUB;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
309 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
310 g_print ("SUB\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
311 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
312 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
313 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
314 | expression '*' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
315 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
316 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
317 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
318 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
319 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
320 *code_ptr++ = PN_OP_MUL;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
321
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
322 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
323 g_print ("MUL\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
324 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
325 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
326 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
327 | expression '/' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
328 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
329 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
330 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
331 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
332 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
333 *code_ptr++ = PN_OP_DIV;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
334
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
335 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
336 g_print ("DIV\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
337 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
338 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
339 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
340 | '-' expression %prec NEG
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
341 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
342 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
343 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
344 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
345 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
346 *code_ptr++ = PN_OP_NEG;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
347
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
348 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
349 g_print ("NEG\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
350 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
351 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
352 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
353 | expression '^' expression
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
354 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
355 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
356 code_size += sizeof (guint);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
357 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
358 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
359 *code_ptr++ = PN_OP_POW;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
360
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
361 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
362 g_print ("POW\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
363 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
364 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
365 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
366 | '(' expression ')'
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
367 ;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
368
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
369 %%
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
370
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
371 static gdouble
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
372 get_named_constant_value (const gchar *name)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
373 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
374 if (g_strcasecmp (name, "pi") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
375 return G_PI;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
376
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
377 /* This is a failure, so don't make a "zero" :) */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
378 return 0.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
379 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
380
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
381 static guint
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
382 get_function_token_type (const gchar *name)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
383 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
384 if (g_strcasecmp (name, "abs") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
385 return ABS_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
386 if (g_strcasecmp (name, "max") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
387 return MAX_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
388 if (g_strcasecmp (name, "min") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
389 return MIN_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
390 if (g_strcasecmp (name, "sin") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
391 return SIN_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
392 if (g_strcasecmp (name, "cos") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
393 return COS_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
394 if (g_strcasecmp (name, "tan") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
395 return TAN_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
396 if (g_strcasecmp (name, "asin") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
397 return ASIN_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
398 if (g_strcasecmp (name, "acos") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
399 return ACOS_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
400 if (g_strcasecmp (name, "atan") == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
401 return ATAN_FUNC;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
402
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
403 return 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
404 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
405
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
406 static gdouble*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
407 get_constant_ptr (gdouble value)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
408 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
409 guint i;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
410
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
411 if (size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
412 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
413 for (i=0; i<temp_constant_table->len; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
414 if (g_array_index (temp_constant_table, gdouble, i) == value)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
415 return (gdouble *) TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
416
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
417 /* Add a constant */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
418 g_array_append_val (temp_constant_table, value);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
419 return (gdouble *) TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
420 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
421 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
422 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
423 for (i=0; i<temp_constant_table->len; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
424 if (parse_script->constant_table[i] == value)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
425 return &parse_script->constant_table[i];
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
426
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
427 return NULL; /* This should never be reached */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
428 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
429 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
430
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
431 int
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
432 yylex (void)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
433 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
434 /* Skip whitespaces */
1717
837983bac90f [svn] Fixed a lot of warnings that only showed up on *BSD.
js
parents: 1507
diff changeset
435 while (isspace ((int) *parse_string)) parse_string++;
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
436
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
437 /* Handle the end of the string */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
438 if (*parse_string == '\0')
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
439 return 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
440
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
441 /* Handle unnamed (numeric) constants */
1717
837983bac90f [svn] Fixed a lot of warnings that only showed up on *BSD.
js
parents: 1507
diff changeset
442 if (*parse_string == '.' || isdigit ((int) *parse_string))
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
443 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
444 gdouble value;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
445
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
446 value = strtod (parse_string, (char **) &parse_string);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
447 yylval.constant = get_constant_ptr (value);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
448
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
449 return CONSTANT;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
450 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
451
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
452 /* Handle alphanumeric symbols */
1717
837983bac90f [svn] Fixed a lot of warnings that only showed up on *BSD.
js
parents: 1507
diff changeset
453 if (isalpha ((int) *parse_string))
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
454 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
455 const gchar *symbol_start = parse_string;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
456 guint function_token;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
457 gchar *symbol_name;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
458
1717
837983bac90f [svn] Fixed a lot of warnings that only showed up on *BSD.
js
parents: 1507
diff changeset
459 while (isalnum ((int) *parse_string) || *parse_string == '_')
837983bac90f [svn] Fixed a lot of warnings that only showed up on *BSD.
js
parents: 1507
diff changeset
460 parse_string++;
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
461
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
462 symbol_name = g_strndup (symbol_start, parse_string - symbol_start);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
463
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
464 /* Handle a named constant (e.g. 'pi') */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
465 if (get_named_constant_value (symbol_name))
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
466 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
467 yylval.constant = get_constant_ptr (get_named_constant_value (symbol_name));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
468
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
469 g_free (symbol_name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
470
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
471 return CONSTANT;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
472 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
473
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
474 /* Handle a function (e.g. 'max') */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
475 if ((function_token = get_function_token_type (symbol_name)))
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
476 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
477 g_free (symbol_name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
478
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
479 return function_token;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
480 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
481
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
482 /* Handle a variable */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
483 if (! size_pass)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
484 yylval.variable = pn_symbol_table_ref_variable_by_name (parse_script->symbol_table,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
485 symbol_name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
486
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
487 g_free (symbol_name);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
488
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
489 return VARIABLE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
490 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
491
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
492 /* Handle a single-character symbol (or invalid tokens) */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
493 return *parse_string++;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
494 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
495
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
496 int
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
497 yyerror (char *s)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
498 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
499 parse_failed = TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
500
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
501 return 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
502 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
503
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
504 gboolean
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
505 pn_script_internal_parse_string (PnScript *script, const gchar *string)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
506 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
507 guint i;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
508
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
509 g_return_val_if_fail (script != NULL, FALSE);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
510 g_return_val_if_fail (PN_IS_SCRIPT (script), FALSE);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
511 g_return_val_if_fail (string != NULL, FALSE);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
512
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
513 /* Make a new temp constant table if needed */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
514 if (! temp_constant_table)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
515 temp_constant_table = g_array_new (FALSE, FALSE, sizeof (gdouble));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
516
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
517 parse_failed = FALSE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
518
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
519 parse_script = script;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
520 parse_string = string;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
521
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
522 /* First determine the code size */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
523 size_pass = TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
524 code_size = 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
525 yyparse ();
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
526
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
527 if (parse_failed)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
528 return FALSE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
529
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
530 if (code_size == 0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
531 return TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
532
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
533 /* Now generate the real code */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
534 size_pass = FALSE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
535 parse_string = string;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
536 script->code = g_malloc (code_size);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
537 script->constant_table = g_malloc (temp_constant_table->len * sizeof (gdouble));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
538 for (i=0; i<temp_constant_table->len; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
539 script->constant_table[i] = g_array_index (temp_constant_table, gdouble, i);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
540 code_ptr = script->code;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
541 yyparse ();
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
542 g_array_set_size (temp_constant_table, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
543
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
544 /* Terminate the script, replacing the last POP with an END */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
545 *(code_ptr-1) = PN_OP_END;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
546
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
547 #ifdef PN_PRINT_OPS
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
548 g_print ("END\n");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
549 #endif /* PN_PRINT_OPS */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
550
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
551 return TRUE;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
552 }