basic:killed sigils; IF statement is broken? (see ltkaput.bas)

This commit is contained in:
minjaesong
2020-12-02 17:49:13 +09:00
parent 5b15a49f88
commit 856764c936
2 changed files with 45 additions and 32 deletions

View File

@@ -326,13 +326,19 @@ bStatus.getArrayIndexFun = function(lnum, arrayName, array) {
// NOTE: BASIC arrays are index in column-major order, which is OPPOSITE of C/JS/etc. // NOTE: BASIC arrays are index in column-major order, which is OPPOSITE of C/JS/etc.
return varArgNum(lnum, args, (dims) => { return varArgNum(lnum, args, (dims) => {
let indexingstr = ""; let indexingstr = "";
serial.println("ar dims: "+dims);
dims.forEach((d) => { dims.forEach((d) => {
indexingstr = `[${d-INDEX_BASE}]${indexingstr}`; indexingstr = `[${d-INDEX_BASE}]${indexingstr}`;
}) })
let indexedValue = eval(`array${indexingstr}`); serial.println("ar indexedValue = "+`/*ar1*/array${indexingstr}`);
let index = dims[0]; let indexedValue = eval(`/*ar1*/array${indexingstr}`);
let parentArr = eval(`array${indexingstr.substring(0, indexingstr.length - 2 - (""+index).length)}`); let index = dims[0]-INDEX_BASE;
return {arrValue: indexedValue, arrObj: parentArr, arrIndex: index-INDEX_BASE, arrName: arrayName} serial.println("ar parentArr = "+`/*ar2*/array${indexingstr.substring(0, indexingstr.length - 2 - (""+index).length)}`);
let parentArr = eval(`/*ar2*/array${indexingstr.substring(0, indexingstr.length - 2 - (""+index).length)}`);
if (index < 0) throw lang.subscrOutOfRng(lnum, arrayName);
return {arrValue: indexedValue, arrObj: parentArr, arrIndex: index, arrName: arrayName}
}); });
//return {arrValue: indexedValue, arrObj: array, arrIndex: rsvArg0, arrName: arrayName}; //array[rsvArg0]; //return {arrValue: indexedValue, arrObj: array, arrIndex: rsvArg0, arrName: arrayName}; //array[rsvArg0];
@@ -356,17 +362,15 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
if (troValue.arrObj !== undefined) { if (troValue.arrObj !== undefined) {
if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh); if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh);
troValue.arrObj[troValue.arrIndex] = rh; troValue.arrObj[troValue.arrIndex] = rh|0;
return {asgnVarName: troValue.arrName, asgnValue: rh}; return {asgnVarName: troValue.arrName, asgnValue: rh|0};
} }
else { else {
var sigil = parseSigil(troValue); var varname = troValue.toUpperCase();
var type = sigil.sgType || JStoBASICtype(rh); var type = JStoBASICtype(rh);
if (bStatus.consts[varname]) throw lang.asgnOnConst(lnum, varname);
if (bStatus.consts[sigil.sgName]) throw lang.asgnOnConst(lnum, sigil.sgName); bStatus.vars[varname] = new BasicVar(rh, type);
return {asgnVarName: varname, asgnValue: rh};
bStatus.vars[sigil.sgName] = new BasicVar(rh, type);
return {asgnVarName: sigil.sgName, asgnValue: rh};
} }
}, },
@@ -618,7 +622,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
"FIX" : function(lnum, args) { "FIX" : function(lnum, args) {
return oneArgNum(lnum, args, (lh) => (lh|0)); return oneArgNum(lnum, args, (lh) => (lh|0));
}, },
"CHR$" : function(lnum, args) { "CHR" : function(lnum, args) {
return oneArgNum(lnum, args, (lh) => String.fromCharCode(lh)); return oneArgNum(lnum, args, (lh) => String.fromCharCode(lh));
}, },
"TEST" : function(lnum, args) { "TEST" : function(lnum, args) {
@@ -704,23 +708,26 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
`----------------- `-----------------
*/ */
"INPUT" : function(lnum, args) { "INPUT" : function(lnum, args) {
// just use tail-end arg as an input variable if (args.length != 1) throw lang.syntaxfehler(lnum, args.length+lang.aG);
var endArg = args.pop(); var troValue = args[0].troValue;
if (endArg === undefined) {
system.printerr("INPUT called with no arguments");
return undefined;
}
// print out prompt text // print out prompt text
print("? "); print("? "); var rh = sys.read().trim();
var inputstr = sys.read().trim(); if (troValue.arrObj !== undefined) {
if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh);
// screw with the comma-separating because shrug troValue.arrObj[troValue.arrIndex] = rh|0;
bStatus.vars[endArg.troValue] = new BasicVar(inputstr, JStoBASICtype(inputstr)); return {asgnVarName: troValue.arrName, asgnValue: rh|0};
}
// return raw input string else {
return inputstr; var varname = troValue.toUpperCase();
//println("input varname: "+varname);
var type = JStoBASICtype(rh);
if (bStatus.consts[varname]) throw lang.asgnOnConst(lnum, varname);
bStatus.vars[varname] = new BasicVar(rh, type);
return {asgnVarName: varname, asgnValue: rh};
}
}, },
"END" : function(lnum, args) { "END" : function(lnum, args) {
serial.println("Program terminated in "+lnum); serial.println("Program terminated in "+lnum);
@@ -729,13 +736,13 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
"SPC" : function(lnum, args) { "SPC" : function(lnum, args) {
return oneArgNum(lnum, args, (lh) => " ".repeat(lh)); return oneArgNum(lnum, args, (lh) => " ".repeat(lh));
}, },
"LEFT$" : function(lnum, args) { "LEFT" : function(lnum, args) {
return twoArg(lnum, args, (str, len) => str.substring(0, len)); return twoArg(lnum, args, (str, len) => str.substring(0, len));
}, },
"MID$" : function(lnum, args) { "MID" : function(lnum, args) {
return threeArg(lnum, args, (str, start, len) => str.substring(start-INDEX_BASE, start-INDEX_BASE+len)); return threeArg(lnum, args, (str, start, len) => str.substring(start-INDEX_BASE, start-INDEX_BASE+len));
}, },
"RIGHT$" : function(lnum, args) { "RIGHT" : function(lnum, args) {
return twoArg(lnum, args, (str, len) => str.substring(str.length - len, str.length)); return twoArg(lnum, args, (str, len) => str.substring(str.length - len, str.length));
}, },
"OPTIONBASE" : function(lnum, args) { "OPTIONBASE" : function(lnum, args) {
@@ -843,10 +850,10 @@ bF._tokenise = function(lnum, cmd) {
tokens.push(sb); sb = "" + char; states.push(mode); tokens.push(sb); sb = "" + char; states.push(mode);
mode = "sep"; mode = "sep";
} }
else if (bF._isNum(charCode)) { /*else if (bF._isNum(charCode)) {
tokens.push(sb); sb = "" + char; states.push(mode); tokens.push(sb); sb = "" + char; states.push(mode);
mode = "num"; mode = "num";
} }*/
else if (bF._is1o(charCode)) { else if (bF._is1o(charCode)) {
tokens.push(sb); sb = "" + char; states.push(mode); tokens.push(sb); sb = "" + char; states.push(mode);
mode = "op"; mode = "op";

6
assets/ltkaput.bas Normal file
View File

@@ -0,0 +1,6 @@
10 c=10
20 if c<4 then 200
30 c=c-1
40 print c
50 goto 20
200 print c