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.
return varArgNum(lnum, args, (dims) => {
let indexingstr = "";
serial.println("ar dims: "+dims);
dims.forEach((d) => {
indexingstr = `[${d-INDEX_BASE}]${indexingstr}`;
})
let indexedValue = eval(`array${indexingstr}`);
let index = dims[0];
let parentArr = eval(`array${indexingstr.substring(0, indexingstr.length - 2 - (""+index).length)}`);
return {arrValue: indexedValue, arrObj: parentArr, arrIndex: index-INDEX_BASE, arrName: arrayName}
serial.println("ar indexedValue = "+`/*ar1*/array${indexingstr}`);
let indexedValue = eval(`/*ar1*/array${indexingstr}`);
let index = dims[0]-INDEX_BASE;
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];
@@ -356,17 +362,15 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
if (troValue.arrObj !== undefined) {
if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh);
troValue.arrObj[troValue.arrIndex] = rh;
return {asgnVarName: troValue.arrName, asgnValue: rh};
troValue.arrObj[troValue.arrIndex] = rh|0;
return {asgnVarName: troValue.arrName, asgnValue: rh|0};
}
else {
var sigil = parseSigil(troValue);
var type = sigil.sgType || JStoBASICtype(rh);
if (bStatus.consts[sigil.sgName]) throw lang.asgnOnConst(lnum, sigil.sgName);
bStatus.vars[sigil.sgName] = new BasicVar(rh, type);
return {asgnVarName: sigil.sgName, asgnValue: rh};
var varname = troValue.toUpperCase();
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};
}
},
@@ -618,7 +622,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
"FIX" : function(lnum, args) {
return oneArgNum(lnum, args, (lh) => (lh|0));
},
"CHR$" : function(lnum, args) {
"CHR" : function(lnum, args) {
return oneArgNum(lnum, args, (lh) => String.fromCharCode(lh));
},
"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) {
// just use tail-end arg as an input variable
var endArg = args.pop();
if (endArg === undefined) {
system.printerr("INPUT called with no arguments");
return undefined;
}
if (args.length != 1) throw lang.syntaxfehler(lnum, args.length+lang.aG);
var troValue = args[0].troValue;
// 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
bStatus.vars[endArg.troValue] = new BasicVar(inputstr, JStoBASICtype(inputstr));
// return raw input string
return inputstr;
troValue.arrObj[troValue.arrIndex] = rh|0;
return {asgnVarName: troValue.arrName, asgnValue: rh|0};
}
else {
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) {
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) {
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));
},
"MID$" : function(lnum, args) {
"MID" : function(lnum, args) {
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));
},
"OPTIONBASE" : function(lnum, args) {
@@ -843,10 +850,10 @@ bF._tokenise = function(lnum, cmd) {
tokens.push(sb); sb = "" + char; states.push(mode);
mode = "sep";
}
else if (bF._isNum(charCode)) {
/*else if (bF._isNum(charCode)) {
tokens.push(sb); sb = "" + char; states.push(mode);
mode = "num";
}
}*/
else if (bF._is1o(charCode)) {
tokens.push(sb); sb = "" + char; states.push(mode);
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