basic:making gosub to work again, new END stmt

This commit is contained in:
minjaesong
2020-11-27 16:11:08 +09:00
parent 2d5db66c17
commit 83e573dab3
2 changed files with 29 additions and 10 deletions

13
assets/99.bas Normal file
View File

@@ -0,0 +1,13 @@
1 FOR I = 99 TO 1
2 MODE = 1
3 GOSUB 12
4 PRINT(I+" bottle"+BOTTLES$+" of beer on the wall, "+i+" bottle"+BOTTLES$+" of beer.")
5 MODE = 2
6 GOSUB 12
7 PRINT("Take one down and pass it around, "+(i-1)+" bottle"+BOTTLES$+" of beer on the wall.")
8 NEXT
9 PRINT "No more bottles of beer on the wall, no more bottles of beer."
10 PRINT "Go to the store and buy some more. 99 bottles of beer on the wall."
11 GOTO 999
12 IF I == MODE THEN BOTTLES$ = "" ELSE BOTTLES$ = "s"
13 RETURN

View File

@@ -494,11 +494,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
var rsvArg = resolve(args[llll]); var rsvArg = resolve(args[llll]);
if (rsvArg === undefined && args[llll].troType != "null") throw lang.refError(lnum, args[llll].troValue); if (rsvArg === undefined && args[llll].troType != "null") throw lang.refError(lnum, args[llll].troValue);
print((rsvArg === undefined) ? "" : rsvArg);
if (args[llll].troType == "num")
print(" "+rsvArg+" ");
else
print((rsvArg === undefined) ? "" : rsvArg);
} }
} }
@@ -524,10 +520,14 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
return oneArgNum(lnum, args, function(lh) { return sys.peek(lh); }); return oneArgNum(lnum, args, function(lh) { return sys.peek(lh); });
}, },
"GOTO" : function(lnum, args) { "GOTO" : function(lnum, args) {
return oneArgNum(lnum, args, function(lh) { return lh; }); return oneArgNum(lnum, args, function(lh) {
if (lh < 0) throw lang.syntaxfehler(lnum, lh);
return lh;
});
}, },
"GOSUB" : function(lnum, args) { "GOSUB" : function(lnum, args) {
return oneArgNum(lnum, args, function(lh) { return oneArgNum(lnum, args, function(lh) {
if (lh < 0) throw lang.syntaxfehler(lnum, lh);
bStatus.gosubStack.push(lnum + 1); bStatus.gosubStack.push(lnum + 1);
return lh; return lh;
}); });
@@ -535,6 +535,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
"RETURN" : function(lnum, args) { "RETURN" : function(lnum, args) {
var r = bStatus.gosubStack.pop(); var r = bStatus.gosubStack.pop();
if (r === undefined) throw lang.nowhereToReturn(lnum); if (r === undefined) throw lang.nowhereToReturn(lnum);
serial.println(lnum+" RETURN to "+r);
return r; return r;
}, },
"CLEAR" : function(lnum, args) { "CLEAR" : function(lnum, args) {
@@ -694,6 +695,10 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
// return raw input string // return raw input string
return inputstr; return inputstr;
},
"END" : function(lnum, args) {
serial.println("Program terminated in "+lnum);
return Number.MAX_SAFE_INTEGER; // GOTO far-far-away
} }
}; };
Object.freeze(bStatus.builtin); Object.freeze(bStatus.builtin);
@@ -1512,7 +1517,7 @@ let SyntaxTreeReturnObj = function(type, value, nextLine) {
this.troValue = value; this.troValue = value;
this.troNextLine = nextLine; this.troNextLine = nextLine;
} }
bF._gotoCmds = { GOTO:1, GOSUB:1, NEXT:1 }; // put nonzero (truthy) value here bF._gotoCmds = {GOTO:1,GOSUB:1,RETURN:1,NEXT:1,END:1}; // put nonzero (truthy) value here
/** /**
* @param lnum line number of BASIC * @param lnum line number of BASIC
* @param syntaxTree BasicAST * @param syntaxTree BasicAST
@@ -1679,7 +1684,7 @@ bF.renum = function(args) { // RENUM function
var cnt = 10; var cnt = 10;
for (var k = 0; k < cmdbuf.length; k++) { for (var k = 0; k < cmdbuf.length; k++) {
if (cmdbuf[k] !== undefined) { if (cmdbuf[k] !== undefined) {
newcmdbuf[cnt] = cmdbuf[k]; newcmdbuf[cnt] = cmdbuf[k].trim();
linenumRelation[k] = cnt; linenumRelation[k] = cnt;
cnt += 10; cnt += 10;
} }
@@ -1687,10 +1692,10 @@ bF.renum = function(args) { // RENUM function
// deal with goto/gosub line numbers // deal with goto/gosub line numbers
for (k = 0; k < newcmdbuf.length; k++) { for (k = 0; k < newcmdbuf.length; k++) {
if (newcmdbuf[k] !== undefined && newcmdbuf[k].toLowerCase().startsWith("goto ")) { if (newcmdbuf[k] !== undefined && newcmdbuf[k].toLowerCase().startsWith("goto ")) {
newcmdbuf[k] = "goto " + linenumRelation[newcmdbuf[k].match(reNum)[0]]; newcmdbuf[k] = "GOTO " + linenumRelation[newcmdbuf[k].match(reNum)[0]];
} }
else if (newcmdbuf[k] !== undefined && newcmdbuf[k].toLowerCase().startsWith("gosub ")) { else if (newcmdbuf[k] !== undefined && newcmdbuf[k].toLowerCase().startsWith("gosub ")) {
newcmdbuf[k] = "gosub " + linenumRelation[newcmdbuf[k].match(reNum)[0]]; newcmdbuf[k] = "GOSUB " + linenumRelation[newcmdbuf[k].match(reNum)[0]];
} }
} }
cmdbuf = newcmdbuf.slice(); // make shallow copy cmdbuf = newcmdbuf.slice(); // make shallow copy
@@ -1715,6 +1720,7 @@ bF.run = function(args) { // RUN function
else { else {
linenumber += 1; linenumber += 1;
} }
if (linenumber < 0) throw lang.badNumberFormat;
if (con.hitterminate()) { if (con.hitterminate()) {
println("Break in "+oldnum); println("Break in "+oldnum);
break; break;