@@ -28,11 +28,11 @@ void cev_udp(void) {
2828}
2929
3030void cev_missing_rp (void ) {
31- sc_raise ("(EXPR): MISSING ')' %d" , IP );
31+ sc_raise ("(EXPR): MISSING ')'" );
3232}
3333
3434void cev_opr_err (void ) {
35- sc_raise ("(EXPR): SYNTAX ERROR (1st OP) " );
35+ sc_raise ("(EXPR): SYNTAX ERROR" );
3636}
3737
3838void cev_prim_str () {
@@ -44,6 +44,96 @@ void cev_prim_str() {
4444 IP += len ;
4545}
4646
47+ void cev_prim_uds () {
48+ while (CODE_PEEK () == kwTYPE_UDS_EL ) {
49+ cev_add1 (kwTYPE_UDS_EL );
50+ cev_add1 (kwTYPE_STR );
51+ IP += 2 ;
52+ cev_prim_str ();
53+ }
54+ }
55+
56+ void cev_prim_var () {
57+ bc_add_n (bc_out , bc_in -> ptr + bc_in -> cp , ADDRSZ );
58+ IP += ADDRSZ ;
59+
60+ cev_prim_uds ();
61+
62+ // support multiple ()
63+ while (CODE_PEEK () == kwTYPE_LEVEL_BEGIN ) {
64+ cev_add1 (kwTYPE_LEVEL_BEGIN );
65+ IP ++ ;
66+ if (CODE_PEEK () == kwTYPE_LEVEL_END ) {
67+ // NULL ARRAYS
68+ cev_add1 (kwTYPE_LEVEL_END );
69+ IP ++ ;
70+ } else {
71+ cev_log ();
72+
73+ while (CODE_PEEK () == kwTYPE_SEP || CODE_PEEK () == kwTO ) {
74+ // DIM X(A TO B)
75+ if (CODE_PEEK () == kwTYPE_SEP ) {
76+ cev_add1 (CODE (IP ));
77+ IP ++ ;
78+ }
79+ cev_add1 (CODE (IP ));
80+ IP ++ ;
81+
82+ cev_log ();
83+ }
84+
85+ if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
86+ cev_missing_rp ();
87+ } else {
88+ cev_add1 (kwTYPE_LEVEL_END );
89+ IP ++ ;
90+ }
91+ }
92+ }
93+ }
94+
95+ // function [(...)]
96+ void cev_prim_args () {
97+ cev_add1 (kwTYPE_LEVEL_BEGIN );
98+ IP ++ ;
99+
100+ if (CODE_PEEK () == kwTYPE_CALL_PTR ) {
101+ cev_add1 (CODE (IP ));
102+ IP ++ ;
103+ }
104+
105+ if (CODE_PEEK () != kwTYPE_SEP ) {
106+ // empty parameter
107+ cev_log ();
108+ }
109+ while (CODE_PEEK () == kwTYPE_SEP ) {
110+ // while parameters
111+ cev_add1 (CODE (IP ));
112+ IP ++ ;
113+ cev_add1 (CODE (IP ));
114+ IP ++ ;
115+
116+ if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
117+ if (CODE_PEEK () != kwTYPE_SEP ) {
118+ cev_log ();
119+ }
120+ }
121+ }
122+
123+ // after (), check for UDS field, eg foo(10).x
124+ if (CODE_PEEK () == kwTYPE_UDS_EL ) {
125+ cev_prim_uds ();
126+ cev_log ();
127+ }
128+
129+ if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
130+ cev_missing_rp ();
131+ } else {
132+ cev_add1 (kwTYPE_LEVEL_END );
133+ IP ++ ;
134+ }
135+ }
136+
47137/*
48138 * prim
49139 */
@@ -74,90 +164,20 @@ void cev_prim() {
74164 IP += ADDRSZ ;
75165 break ;
76166 case kwTYPE_VAR :
77- bc_add_n (bc_out , bc_in -> ptr + bc_in -> cp , ADDRSZ ); // 1 addr
78- IP += ADDRSZ ;
79-
80- while (CODE_PEEK () == kwTYPE_UDS_EL ) {
81- cev_add1 (kwTYPE_UDS_EL );
82- cev_add1 (kwTYPE_STR );
83- IP += 2 ;
84- cev_prim_str ();
85- }
86-
87- // support multiple ()
88- while (CODE_PEEK () == kwTYPE_LEVEL_BEGIN ) {
89- cev_add1 (kwTYPE_LEVEL_BEGIN );
90- IP ++ ;
91- if (CODE_PEEK () == kwTYPE_LEVEL_END ) { // NULL ARRAYS
92- cev_add1 (kwTYPE_LEVEL_END );
93- IP ++ ;
94- } else {
95- cev_log ();
96-
97- while (CODE_PEEK () == kwTYPE_SEP || CODE_PEEK () == kwTO ) {
98- // DIM X(A TO B)
99- if (CODE_PEEK () == kwTYPE_SEP ) {
100- cev_add1 (CODE (IP ));
101- IP ++ ;
102- }
103- cev_add1 (CODE (IP ));
104- IP ++ ;
105-
106- cev_log ();
107- }
108-
109- if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
110- cev_missing_rp ();
111- } else {
112- cev_add1 (kwTYPE_LEVEL_END );
113- IP ++ ;
114- }
115- }
116- }
167+ cev_prim_var ();
117168 break ;
118169 case kwTYPE_CALL_UDF : // [udf1][addr2]
119170 case kwTYPE_CALLEXTF : // [lib][index]
120171 bc_add_n (bc_out , bc_in -> ptr + bc_in -> cp , ADDRSZ );
121- IP += ADDRSZ ;
122- // no break here
172+ IP += ADDRSZ ; // no break here
123173 case kwTYPE_CALLF : // [code]
124174 bc_add_n (bc_out , bc_in -> ptr + bc_in -> cp , ADDRSZ );
125- IP += ADDRSZ ;
126- // no break here
175+ IP += ADDRSZ ; // no break here
127176 default :
128- // function [(...)]
129177 if (CODE_PEEK () == kwTYPE_LEVEL_BEGIN ) {
130- cev_add1 (kwTYPE_LEVEL_BEGIN );
131- IP ++ ;
132-
133- if (CODE_PEEK () == kwTYPE_CALL_PTR ) {
134- cev_add1 (CODE (IP ));
135- IP ++ ;
136- }
137-
138- if (CODE_PEEK () != kwTYPE_SEP ) { // empty parameter
139- cev_log ();
140- }
141- while (CODE_PEEK () == kwTYPE_SEP ) { // while parameters
142- cev_add1 (CODE (IP ));
143- IP ++ ;
144- cev_add1 (CODE (IP ));
145- IP ++ ;
146-
147- if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
148- if (CODE_PEEK () != kwTYPE_SEP ) {
149- cev_log ();
150- }
151- }
152- }
153-
154- if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
155- cev_missing_rp ();
156- } else {
157- cev_add1 (kwTYPE_LEVEL_END );
158- IP ++ ;
159- }
178+ cev_prim_args ();
160179 }
180+ break ;
161181 };
162182}
163183
@@ -167,24 +187,7 @@ void cev_prim() {
167187void cev_parenth () {
168188 IF_ERR_RTN ;
169189 if (CODE_PEEK () == kwTYPE_LEVEL_BEGIN ) {
170- cev_add1 (kwTYPE_LEVEL_BEGIN );
171- IP ++ ;
172-
173- cev_log (); // R = cev_log
174- IF_ERR_RTN ;
175-
176- if (CODE_PEEK () == kwTYPE_SEP ) {
177- cev_add1 (kwTYPE_SEP );
178- IP ++ ;
179- cev_add1 (CODE (IP ));
180- IP ++ ;
181- } else if (CODE_PEEK () != kwTYPE_LEVEL_END ) {
182- cev_missing_rp ();
183- return ;
184- } else {
185- cev_add1 (kwTYPE_LEVEL_END );
186- IP ++ ;
187- }
190+ cev_prim_args ();
188191 } else {
189192 cev_prim ();
190193 }
0 commit comments