



InfixRvalueTerm (lines 131-278)
Back to List
Browsing infix.h
0131 [ InfixRvalueTerm n w i initial_wn wa wl sign base digit dcount;
0132
0133 initial_wn = wn;
0134
0135 infix_parsed_lvalue = -1;
0136 infix_term_type = INFIXTT_NUMBER;
0137
0138 w = NextWordStopped();
0139 if (w == -1) return -1;
0140
0141 wa = WordAddress(wn-1);
0142 wl = WordLength(wn-1);
0143 if (wa->0 == '-' or '$' or '0' or '1' or '2' or '3'
0144 or '4' or '5' or '6' or '7' or '8' or '9') {
0145 ! Parse decimal, hex or binary number
0146
0147 sign = 1; base = 10; dcount = 0;
0148 if (wa->0 == '-') { sign = -1; wl--; wa++; }
0149 else {
0150 if (wa->0 == '$') { base = 16; wl--; wa++; }
0151 if (wa->0 == '$') { base = 2; wl--; wa++; }
0152 }
0153 if (wl == 0) return -1;
0154 n = 0;
0155 while (wl > 0) {
0156 if (wa->0 >= 'a') digit = wa->0 - 'a' + 10;
0157 else digit = wa->0 - '0';
0158 dcount++;
0159 switch (base) {
0160 2:
0161 if (dcount == 17) return -1;
0162 10:
0163 if (dcount == 6) return -1;
0164 if (dcount == 5) {
0165 if (n > 3276) return -1;
0166 if (n == 3276) {
0167 if (sign == 1 && digit > 7) return -1;
0168 if (sign == -1 && digit > 8) return -1;
0169 }
0170 }
0171 16:
0172 if (dcount == 5) return -1;
0173 }
0174 if (digit >= 0 && digit < base) n = base*n + digit;
0175 else return -1;
0176 wl--; wa++;
0177 }
0178 parsed_number = n*sign; return 1;
0179 }
0180
0181 ! Parse character constant 'a'
0182
0183 if (wl == 3 && wa->0 == ''' && wa->2 == ''') {
0184 parsed_number = wa->1; return 1;
0185 }
0186
0187 ! ##Action, 'dword'
0188
0189 switch (w) {
0190 '##':
0191 infix_term_type = INFIXTT_ACTION;
0192 w = NextWordStopped(); if (w == -1) return -1;
0193 wn--;
0194 if (InfixActionToken() == 0) return 1;
0195 return -1;
0196 '^^':
0197 infix_term_type = INFIXTT_DWORD;
0198 w = NextWordStopped(); if (w == -1) return -1;
0199 parsed_number = w; return 1;
0200 }
0201
0202 ! Test for attribute, property, class name, variable name, array name, routine
0203 ! name, constant name
0204
0205 wn--;
0206 if ((wa->0 >= 'a' && wa->0 <= 'z') ||
0207 (wa->0 >= 'A' && wa->0 <= 'Z') ||
0208 wa->0 == '_') {
0209
0210
0211 infix_term_type = INFIXTT_ATTRIBUTE;
0212 if (InfixMatchPrule(InfixPrintAttribute, #lowest_attribute_number,
0213 #highest_attribute_number, wa, wl)) {
0214 wn++; return 1; }
0215
0216 infix_term_type = INFIXTT_PROPERTY;
0217 if (InfixMatchPrule(InfixPrintProperty, #lowest_property_number,
0218 #highest_property_number, wa, wl)) {
0219 wn++; return 1; }
0220
0221 infix_term_type = INFIXTT_GLOBAL;
0222 if (InfixMatchPrule(InfixPrintGlobal, #lowest_global_number,
0223 #highest_global_number, wa, wl)) {
0224 infix_parsed_lvalue = parsed_number-16;
0225 parsed_number = #globals_array-->infix_parsed_lvalue;
0226 wn++; return 1;
0227 }
0228
0229 infix_term_type = INFIXTT_ARRAY;
0230 if (InfixMatchPrule(InfixPrintArray, #lowest_array_number,
0231 #highest_array_number, wa, wl)) {
0232 infix_parsed_lvalue = parsed_number;
0233 parsed_number = Symb__Tab(INFIXTT_ARRAY,parsed_number);
0234 infix_data1 = temp__global3;
0235 infix_data2 = temp__global2;
0236 wn++; return 1;
0237 }
0238
0239 infix_term_type = INFIXTT_ROUTINE;
0240 if (InfixMatchPrule(InfixPrintRoutine, #lowest_routine_number,
0241 #highest_routine_number, wa, wl)) {
0242 infix_parsed_lvalue = parsed_number;
0243 parsed_number = Symb__Tab(INFIXTT_ROUTINE,parsed_number);
0244 infix_data1 = temp__global3;
0245 infix_data2 = temp__global2;
0246 wn++; return 1;
0247 }
0248
0249 infix_term_type = INFIXTT_CONSTANT;
0250 if (InfixMatchPrule(InfixPrintConstant, #lowest_constant_number,
0251 #highest_constant_number, wa, wl)) {
0252 infix_parsed_lvalue = parsed_number;
0253 parsed_number = Symb__Tab(INFIXTT_CONSTANT,parsed_number);
0254 infix_data1 = temp__global3;
0255 infix_data2 = temp__global2;
0256 wn++; return 1;
0257 }
0258
0259 switch (w) {
0260 'parent', 'child', 'children',
0261 'random', 'metaclass', 'sibling':
0262 parsed_number = w;
0263 infix_parsed_lvalue = INFIXTT_SYSFUN;
0264 wn++; return 1;
0265 }
0266 }
0267
0268 infix_term_type = INFIXTT_NAMEDOBJECT;
0269
0270 wn = initial_wn; i = ParseToken(SCOPE_TT, InfixBigScope);
0271
0272 if (i == GPR_REPARSE) return i;
0273 if (i > GPR_MULTIPLE) {
0274 print "(", (name) i, " (", i, "))^";
0275 parsed_number = i; return 1;
0276 }
0277 return -1;
0278 ]; ! end of InfixRvalueTerm
Last updated 27 February 2004. The librarian in charge of this page is Graham Nelson (graham@gnelson.demon.co.uk) assisted by C Knight. Please email any comments, suggestions or corrections to cedenqs@inform-fiction.org.