• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

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

変更サマリ

差分

--- a/mips/megalopa/class.c
+++ b/mips/megalopa/class.c
@@ -876,7 +876,8 @@ char* static_method(char type){
876876 char* err;
877877 int* data;
878878 int record[3];
879- int i,opos,method,stack;
879+ int i,spos,opos,method,stack;
880+ spos=g_srcpos;
880881 next_position();
881882 // Check class name
882883 i=check_var_name();
@@ -891,12 +892,15 @@ char* static_method(char type){
891892 break;
892893 }
893894 }
895+ if (i) {
896+ g_srcpos=spos;
897+ return ERR_NO_CLASS;
898+ }
894899 // Check '::'
895900 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
896901 g_srcpos++;
897902 if (g_source[g_srcpos]!=':') return ERR_SYNTAX;
898903 g_srcpos++;
899- if (i) return ERR_NO_CLASS;
900904 data=(int*)data[2];
901905 // Check method
902906 i=check_var_name();
--- a/mips/megalopa/clib.c
+++ b/mips/megalopa/clib.c
@@ -273,13 +273,14 @@ void lib_clib(int* params, void* address){
273273 asm volatile("addu $gp,$s0,$zero");
274274 }
275275
276-char* clib_statement(){
276+char* clib_method(char type){
277277 char* err;
278278 int* record;
279279 int clib,func;
280- int numparams,stack;
280+ int numparams,stack,spos;
281281 // CLIB name
282282 next_position();
283+ spos=g_srcpos;
283284 clib=check_var_name();
284285 if (clib<65536) return ERR_SYNTAX;
285286 // Check if the clib exists
@@ -287,11 +288,13 @@ char* clib_statement(){
287288 while (record=cmpdata_find(CMPDATA_USECLIB)){
288289 if (record[1]==clib) break;
289290 }
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;
293297 // Function name
294- next_position();
295298 func=check_var_name();
296299 if (func<65536) return ERR_SYNTAX;
297300 cmpdata_reset();
@@ -299,23 +302,43 @@ char* clib_statement(){
299302 if (record[1]==clib && record[2]==func) break;
300303 }
301304 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+ }
302316 // Construct parameter(s)
303317 next_position();
304318 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;
309338 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]==',');
319342 }
320343 // Call CLIB
321344 check_obj_space(2);
@@ -327,3 +350,6 @@ char* clib_statement(){
327350 return 0;
328351 }
329352
353+char* clib_statement(){
354+ return clib_method(',');
355+}
\ No newline at end of file
--- a/mips/megalopa/compiler.h
+++ b/mips/megalopa/compiler.h
@@ -396,6 +396,7 @@ char* interrupt_statement();
396396
397397 char* useclib_statement();
398398 char* useclib_begin(char* buff);
399+char* clib_method(char type);
399400 char* clib_statement();
400401
401402 char* hex_init_file(char* buff,char* filename);
@@ -438,6 +439,7 @@ char* hex_construct_line();
438439 #define ERR_COMPILE_CLIB (char*)(g_err_str[30])
439440 #define ERR_NO_CLIB (char*)(g_err_str[31])
440441 #define ERR_HEX_ERROR (char*)(g_err_str[32])
442+#define ERR_NO_CLASS_CLIB (char*)(g_err_str[32])
441443
442444 /* compile data type numbers */
443445 #define CMPDATA_RESERVED 0
--- a/mips/megalopa/debug.c
+++ b/mips/megalopa/debug.c
@@ -235,8 +235,8 @@ static const char initext[]=
235235 static const char bastext[]=
236236 "useclib TCLIB\n"
237237 "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"
240240 "\n"
241241 "\n"
242242 "\n"
@@ -266,26 +266,31 @@ static const char hextext[]=
266266 ":108020001c80998f09f82003000000001000bc8f0d\n"
267267 ":108030002080828f1c00bf8f0800e0032000bd2736\n"
268268 ":020000040000fa\n"
269-":107f80000000000000000080a07f00a0708000a022\n"
270-":107f9000fc8000a0000001a0788000a0000000008c\n"
269+":107f80000000000000000080a87f00a0408000a04a\n"
270+":107f9000408100a0000001a0f08000a0048100a0aa\n"
271+":087fa000488000a00000000071\n"
271272 ":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"
279287 ":020000040000fa\n"
280-":1080d40048656c6c6f20576f726c6421000000005f\n"
281-":1080e4005468697320697320612074657374000097\n"
282-":0880f400544553540000000044\n"
288+":1081180048656c6c6f20576f726c6421000000001a\n"
289+":108128005468697320697320612074657374000052\n"
290+":088138005445535400000000ff\n"
283291 ":020000040000fa\n"
284-":1080fc0040010000800000001c8100a00000000076\n"
285-":020000040000fa\n"
286-":10810c0000000000222222222222222222222222cb\n"
287-":020000040000fa\n"
288-":0c811c00f48000a0a08000a00000000083\n"
292+":108140004001000080000000508100a000000000fd\n"
293+":0c815000388100a0708000a0000000003a\n"
289294 ":00000001FF\n"
290295 ;
291296
--- a/mips/megalopa/error.c
+++ b/mips/megalopa/error.c
@@ -45,6 +45,7 @@ const char* g_err_str[]={
4545 "ERR_COMPILE_CLIB",
4646 "C library not found",
4747 "HEX file syntax error",
48+ "Class or C library not found",
4849 };
4950
5051 char* resolve_label(int s6){
--- a/mips/megalopa/function.c
+++ b/mips/megalopa/function.c
@@ -501,7 +501,10 @@ char* float_function(void){
501501 } else {
502502 // Check if static method of a class
503503 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+ }
505508 }
506509 if (err) return err;
507510 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -542,7 +545,10 @@ char* str_function(void){
542545 } else {
543546 // Check if static method of a class
544547 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+ }
546552 }
547553 if (err) return err;
548554 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;
@@ -630,9 +636,12 @@ char* function(void){
630636 f=int_func_list[i+1];
631637 err=f();
632638 } else {
633- // Check if static method of a class
639+ // Check if static method of a class of clib
634640 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+ }
636645 }
637646 if (err) return err;
638647 if (g_source[g_srcpos]!=')') return ERR_SYNTAX;