@@ -86,6 +86,38 @@ bool ps_visit_compound_statement(ps_interpreter *interpreter, ps_interpreter_mod
8686// VISIT_END("OK");
8787// }
8888
89+ bool ps_visit_assignment_array (ps_interpreter * interpreter , ps_interpreter_mode mode , ps_symbol * variable )
90+ {
91+ VISIT_BEGIN ("ASSIGNMENT" , "ARRAY" )
92+
93+ ps_value result = {.type = & ps_system_none , .data .v = NULL };
94+ ps_value index = {.type = & ps_system_none , .data .v = NULL };
95+
96+ EXPECT_TOKEN (PS_TOKEN_LEFT_BRACKET )
97+ READ_NEXT_TOKEN
98+ index .type = variable -> value -> type -> value -> data .t -> def .a .subrange ;
99+ if (!ps_visit_expression (interpreter , mode , & index ))
100+ TRACE_ERROR ("INDEX" )
101+ EXPECT_TOKEN (PS_TOKEN_RIGHT_BRACKET )
102+ READ_NEXT_TOKEN
103+ EXPECT_TOKEN (PS_TOKEN_ASSIGN )
104+ READ_NEXT_TOKEN
105+ result .type = variable -> value -> type -> value -> data .t -> def .a .item_type ;
106+ if (!ps_visit_expression (interpreter , mode , & result ))
107+ TRACE_ERROR ("EXPRESSION1 ")
108+ if (mode == MODE_EXEC )
109+ {
110+ ps_error error = ps_array_set_value (variable , & index , & result , interpreter -> range_check );
111+ if (error != PS_ERROR_NONE )
112+ {
113+ interpreter -> error = error ;
114+ TRACE_ERROR ("ARRAY_ASSIGN" )
115+ }
116+ }
117+
118+ VISIT_END ("OK" )
119+ }
120+
89121/**
90122 * Visit assignment:
91123 * IDENTIFIER := EXPRESSION
@@ -98,11 +130,9 @@ bool ps_visit_compound_statement(ps_interpreter *interpreter, ps_interpreter_mod
98130 */
99131bool ps_visit_assignment (ps_interpreter * interpreter , ps_interpreter_mode mode , ps_symbol * variable )
100132{
101- // interpreter->debug = DEBUG_TRACE;
102133 VISIT_BEGIN ("ASSIGNMENT" , "" )
103134
104135 ps_value result = {.type = & ps_system_none , .data .v = NULL };
105- ps_value index = {.type = & ps_system_none , .data .v = NULL };
106136
107137 if (variable -> kind == PS_SYMBOL_KIND_CONSTANT )
108138 {
@@ -122,28 +152,8 @@ bool ps_visit_assignment(ps_interpreter *interpreter, ps_interpreter_mode mode,
122152 if (ps_value_get_type (variable -> value ) == PS_TYPE_ARRAY )
123153 {
124154 // => array[index] := expression
125- EXPECT_TOKEN (PS_TOKEN_LEFT_BRACKET )
126- READ_NEXT_TOKEN
127- index .type = variable -> value -> type -> value -> data .t -> def .a .subrange ;
128- if (!ps_visit_expression (interpreter , mode , & index ))
129- TRACE_ERROR ("INDEX" )
130- EXPECT_TOKEN (PS_TOKEN_RIGHT_BRACKET )
131- READ_NEXT_TOKEN
132- EXPECT_TOKEN (PS_TOKEN_ASSIGN )
133- READ_NEXT_TOKEN
134- result .type = variable -> value -> type -> value -> data .t -> def .a .item_type ;
135- if (!ps_visit_expression (interpreter , mode , & result ))
136- TRACE_ERROR ("EXPRESSION1 ")
137- ps_value_debug (stderr , "* * * RESULT ", & result );
138- ps_value_debug (stderr , "* * * INDEX ", & index );
139- ps_error error = ps_array_set_value (variable , & index , & result , interpreter -> range_check );
140- if (error != PS_ERROR_NONE )
141- {
142- interpreter -> error = error ;
143- TRACE_ERROR ("ARRAY_ASSIGN" )
144- }
145- fprintf (stderr , "\n\n*** HERE! ***\n\n" );
146- ps_array_debug_values (stderr , variable );
155+ if (!ps_visit_assignment_array (interpreter , mode , variable ))
156+ TRACE_ERROR ("ARRAY" )
147157 }
148158 else
149159 {
0 commit comments