BASIC compiler/interpreter for PIC32MX/MZ-80K
リビジョン | e78e004f6fc573b9d3e3f4b1d2f614ebdbdde2a2 (tree) |
---|---|
日時 | 2019-05-14 04:20:46 |
作者 | Katsumi <kmorimatsu@sour...> |
コミッター | Katsumi |
Add CLIB::METHOD style for calling C library
@@ -876,7 +876,8 @@ char* static_method(char type){ | ||
876 | 876 | char* err; |
877 | 877 | int* data; |
878 | 878 | int record[3]; |
879 | - int i,opos,method,stack; | |
879 | + int i,spos,opos,method,stack; | |
880 | + spos=g_srcpos; | |
880 | 881 | next_position(); |
881 | 882 | // Check class name |
882 | 883 | i=check_var_name(); |
@@ -891,12 +892,15 @@ char* static_method(char type){ | ||
891 | 892 | break; |
892 | 893 | } |
893 | 894 | } |
895 | + if (i) { | |
896 | + g_srcpos=spos; | |
897 | + return ERR_NO_CLASS; | |
898 | + } | |
894 | 899 | // Check '::' |
895 | 900 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
896 | 901 | g_srcpos++; |
897 | 902 | if (g_source[g_srcpos]!=':') return ERR_SYNTAX; |
898 | 903 | g_srcpos++; |
899 | - if (i) return ERR_NO_CLASS; | |
900 | 904 | data=(int*)data[2]; |
901 | 905 | // Check method |
902 | 906 | i=check_var_name(); |
@@ -273,13 +273,14 @@ void lib_clib(int* params, void* address){ | ||
273 | 273 | asm volatile("addu $gp,$s0,$zero"); |
274 | 274 | } |
275 | 275 | |
276 | -char* clib_statement(){ | |
276 | +char* clib_method(char type){ | |
277 | 277 | char* err; |
278 | 278 | int* record; |
279 | 279 | int clib,func; |
280 | - int numparams,stack; | |
280 | + int numparams,stack,spos; | |
281 | 281 | // CLIB name |
282 | 282 | next_position(); |
283 | + spos=g_srcpos; | |
283 | 284 | clib=check_var_name(); |
284 | 285 | if (clib<65536) return ERR_SYNTAX; |
285 | 286 | // Check if the clib exists |
@@ -287,11 +288,13 @@ char* clib_statement(){ | ||
287 | 288 | while (record=cmpdata_find(CMPDATA_USECLIB)){ |
288 | 289 | if (record[1]==clib) break; |
289 | 290 | } |
290 | - if (!record) return ERR_NO_CLIB; | |
291 | - next_position(); | |
292 | - if (g_source[g_srcpos++]!=',') return ERR_SYNTAX; | |
291 | + if (!record) { | |
292 | + g_srcpos=spos; | |
293 | + return ERR_NO_CLIB; | |
294 | + } | |
295 | + if (g_source[g_srcpos++]!=':') return ERR_SYNTAX; | |
296 | + if (g_source[g_srcpos++]!=':') return ERR_SYNTAX; | |
293 | 297 | // Function name |
294 | - next_position(); | |
295 | 298 | func=check_var_name(); |
296 | 299 | if (func<65536) return ERR_SYNTAX; |
297 | 300 | cmpdata_reset(); |
@@ -299,23 +302,43 @@ char* clib_statement(){ | ||
299 | 302 | if (record[1]==clib && record[2]==func) break; |
300 | 303 | } |
301 | 304 | if (!record) return "Function not found in the C library"; |
305 | + // Check type and following syntax | |
306 | + if (type==',') { | |
307 | + // This is CLIB(CLASS:METHOD) style | |
308 | + } else { | |
309 | + // Type is either 0 (integer), $ (string), or # (float) | |
310 | + // This is CLASS::METHOD() style | |
311 | + if (type) { | |
312 | + if (g_source[g_srcpos++]!=type) return ERR_SYNTAX; | |
313 | + } | |
314 | + if (g_source[g_srcpos++]!='(') return ERR_SYNTAX; | |
315 | + } | |
302 | 316 | // Construct parameter(s) |
303 | 317 | next_position(); |
304 | 318 | numparams=0; |
305 | - while (g_source[g_srcpos]==',') { | |
306 | - numparams++; | |
307 | - if (4<numparams) return ERR_SYNTAX; | |
308 | - else if (1==numparams) { | |
319 | + if (','==type && g_source[g_srcpos]!=',') { | |
320 | + // This is CLIB(CLASS:METHOD) style | |
321 | + // no parameter | |
322 | + } else if (','!=type && g_source[g_srcpos]==')') { | |
323 | + // This is CLASS::METHOD() style | |
324 | + // no parameter | |
325 | + } else { | |
326 | + // There is parameter(s) | |
327 | + do { | |
328 | + numparams++; | |
329 | + if (4<numparams) return ERR_SYNTAX; | |
330 | + else if (1==numparams) { | |
331 | + check_obj_space(1); | |
332 | + stack=g_objpos++; | |
333 | + } | |
334 | + if (g_source[g_srcpos]==',') g_srcpos++; | |
335 | + g_object[stack]=0x27BD0000|(65536-numparams*4); // addiu sp,sp,-xx | |
336 | + err=get_stringFloatOrValue(); | |
337 | + if (err) return err; | |
309 | 338 | check_obj_space(1); |
310 | - stack=g_objpos++; | |
311 | - } | |
312 | - g_srcpos++; | |
313 | - g_object[stack]=0x27BD0000|(65536-numparams*4); // addiu sp,sp,-xx | |
314 | - err=get_stringFloatOrValue(); | |
315 | - if (err) return err; | |
316 | - check_obj_space(1); | |
317 | - g_object[g_objpos++]=0xAFA20000|(numparams*4); // sw v0,xx(sp) | |
318 | - next_position(); | |
339 | + g_object[g_objpos++]=0xAFA20000|(numparams*4); // sw v0,xx(sp) | |
340 | + next_position(); | |
341 | + } while (g_source[g_srcpos]==','); | |
319 | 342 | } |
320 | 343 | // Call CLIB |
321 | 344 | check_obj_space(2); |
@@ -327,3 +350,6 @@ char* clib_statement(){ | ||
327 | 350 | return 0; |
328 | 351 | } |
329 | 352 | |
353 | +char* clib_statement(){ | |
354 | + return clib_method(','); | |
355 | +} | |
\ No newline at end of file |
@@ -396,6 +396,7 @@ char* interrupt_statement(); | ||
396 | 396 | |
397 | 397 | char* useclib_statement(); |
398 | 398 | char* useclib_begin(char* buff); |
399 | +char* clib_method(char type); | |
399 | 400 | char* clib_statement(); |
400 | 401 | |
401 | 402 | char* hex_init_file(char* buff,char* filename); |
@@ -438,6 +439,7 @@ char* hex_construct_line(); | ||
438 | 439 | #define ERR_COMPILE_CLIB (char*)(g_err_str[30]) |
439 | 440 | #define ERR_NO_CLIB (char*)(g_err_str[31]) |
440 | 441 | #define ERR_HEX_ERROR (char*)(g_err_str[32]) |
442 | +#define ERR_NO_CLASS_CLIB (char*)(g_err_str[32]) | |
441 | 443 | |
442 | 444 | /* compile data type numbers */ |
443 | 445 | #define CMPDATA_RESERVED 0 |
@@ -235,8 +235,8 @@ static const char initext[]= | ||
235 | 235 | static const char bastext[]= |
236 | 236 | "useclib TCLIB\n" |
237 | 237 | "CLS\n" |
238 | -"print clib$(TCLIB,TEST,0);\n" | |
239 | -"print clib$(TCLIB,TEST,1)\n" | |
238 | +"print TCLIB::TEST$(0);\n" | |
239 | +"print clib$(TCLIB::TEST,1)\n" | |
240 | 240 | "\n" |
241 | 241 | "\n" |
242 | 242 | "\n" |
@@ -266,26 +266,31 @@ static const char hextext[]= | ||
266 | 266 | ":108020001c80998f09f82003000000001000bc8f0d\n" |
267 | 267 | ":108030002080828f1c00bf8f0800e0032000bd2736\n" |
268 | 268 | ":020000040000fa\n" |
269 | -":107f80000000000000000080a07f00a0708000a022\n" | |
270 | -":107f9000fc8000a0000001a0788000a0000000008c\n" | |
269 | +":107f80000000000000000080a87f00a0408000a04a\n" | |
270 | +":107f9000408100a0000001a0f08000a0048100a0aa\n" | |
271 | +":087fa000488000a00000000071\n" | |
271 | 272 | ":020000040000fa\n" |
272 | -":108070000800e0030000000000001c3cf87e9c2784\n" | |
273 | -":1080800021e09903040080542480828f2480828f11\n" | |
274 | -":108090000800e003d48042240800e003e480422486\n" | |
275 | -":1080a00000001c3cd07e9c2721e09903e0ffbd2707\n" | |
276 | -":1080b0001c00bfaf1000bcaf2880998f09f82003c7\n" | |
277 | -":1080c000000000001000bc8f1c00bf8f0800e00300\n" | |
278 | -":0480d0002000bd27a8\n" | |
273 | +":108040000800e0030000000000001c3c287f9c2783\n" | |
274 | +":1080500021e09903040080542480828f2480828f41\n" | |
275 | +":108060000800e003188142240800e003288142242c\n" | |
276 | +":1080700000001c3c007f9c2721e09903d8ffbd270e\n" | |
277 | +":108080002400bfaf2000b1af1c00b0af1000bcafe8\n" | |
278 | +":10809000218880001880908f040004240000058e41\n" | |
279 | +":1080a0002880998f09f82003000000001000bc8f81\n" | |
280 | +":1080b000212040000000058e2c80998f09f82003b4\n" | |
281 | +":1080c000000000001000bc8f212020023080998f1a\n" | |
282 | +":1080d00009f82003000000001000bc8f2400bf8faf\n" | |
283 | +":1080e0002000b18f1c00b08f0800e0032800bd27de\n" | |
284 | +":1080f0000000a28c080040000800bc8c0800e003cf\n" | |
285 | +":10810000000000000400a28c080040000800bc8ca5\n" | |
286 | +":088110000800e003000000007c\n" | |
279 | 287 | ":020000040000fa\n" |
280 | -":1080d40048656c6c6f20576f726c6421000000005f\n" | |
281 | -":1080e4005468697320697320612074657374000097\n" | |
282 | -":0880f400544553540000000044\n" | |
288 | +":1081180048656c6c6f20576f726c6421000000001a\n" | |
289 | +":108128005468697320697320612074657374000052\n" | |
290 | +":088138005445535400000000ff\n" | |
283 | 291 | ":020000040000fa\n" |
284 | -":1080fc0040010000800000001c8100a00000000076\n" | |
285 | -":020000040000fa\n" | |
286 | -":10810c0000000000222222222222222222222222cb\n" | |
287 | -":020000040000fa\n" | |
288 | -":0c811c00f48000a0a08000a00000000083\n" | |
292 | +":108140004001000080000000508100a000000000fd\n" | |
293 | +":0c815000388100a0708000a0000000003a\n" | |
289 | 294 | ":00000001FF\n" |
290 | 295 | ; |
291 | 296 |
@@ -45,6 +45,7 @@ const char* g_err_str[]={ | ||
45 | 45 | "ERR_COMPILE_CLIB", |
46 | 46 | "C library not found", |
47 | 47 | "HEX file syntax error", |
48 | + "Class or C library not found", | |
48 | 49 | }; |
49 | 50 | |
50 | 51 | char* resolve_label(int s6){ |
@@ -501,7 +501,10 @@ char* float_function(void){ | ||
501 | 501 | } else { |
502 | 502 | // Check if static method of a class |
503 | 503 | err=static_method('#'); |
504 | - //return ERR_SYNTAX; | |
504 | + if (err==ERR_NO_CLASS) { | |
505 | + err=clib_method('#'); | |
506 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
507 | + } | |
505 | 508 | } |
506 | 509 | if (err) return err; |
507 | 510 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -542,7 +545,10 @@ char* str_function(void){ | ||
542 | 545 | } else { |
543 | 546 | // Check if static method of a class |
544 | 547 | err=static_method('$'); |
545 | - //return ERR_SYNTAX; | |
548 | + if (err==ERR_NO_CLASS) { | |
549 | + err=clib_method('$'); | |
550 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
551 | + } | |
546 | 552 | } |
547 | 553 | if (err) return err; |
548 | 554 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |
@@ -630,9 +636,12 @@ char* function(void){ | ||
630 | 636 | f=int_func_list[i+1]; |
631 | 637 | err=f(); |
632 | 638 | } else { |
633 | - // Check if static method of a class | |
639 | + // Check if static method of a class of clib | |
634 | 640 | err=static_method(0); |
635 | - //return ERR_SYNTAX; | |
641 | + if (err==ERR_NO_CLASS) { | |
642 | + err=clib_method(0); | |
643 | + if (err==ERR_NO_CLIB) err=ERR_NO_CLASS_CLIB; | |
644 | + } | |
636 | 645 | } |
637 | 646 | if (err) return err; |
638 | 647 | if (g_source[g_srcpos]!=')') return ERR_SYNTAX; |