diff --git a/src/toolsrc/parse.pla b/src/toolsrc/parse.pla index 26a8b1f..dfb063d 100644 --- a/src/toolsrc/parse.pla +++ b/src/toolsrc/parse.pla @@ -211,19 +211,19 @@ end // def parse_list#2 byte listdepth, stackdepth - word listseq + word listseq, exprseq listseq = NULL listdepth = 0 repeat listseq, stackdepth = parse_expr(listseq) listdepth = listdepth + stackdepth - until (not listseq) or (token <> COMMA_TKN) + until token <> COMMA_TKN return listseq, listdepth end def parse_value(codeseq, rvalue)#2 - byte cfnparms, cfnvals, stackdepth, deref, type, operation - word optos, idptr, value, const_offset + byte cfnparms, cfnvals, stackdepth, deref, operation + word type, optos, idptr, value, const_offset word uopseq, valseq, idxseq deref = rvalue @@ -271,8 +271,8 @@ def parse_value(codeseq, rvalue)#2 when token is ID_TKN idptr = lookup_id(tknptr, tknlen) - if not idptr; return NULL, 0; fin - if not idptr=>idtype; return NULL, 0; fin + if not idptr; return codeseq, 0; fin + if not idptr=>idtype; return codeseq, 0; fin type = type | idptr=>idtype value = idptr=>idval if type & CONST_TYPE @@ -533,18 +533,16 @@ def parse_set(codeseq) rparms = 0 lambda_set = lambda_cnt setptr = tknptr - memset(@setseq, 0, 16) repeat setseq[lparms], drop = parse_value(NULL, LVALUE) if not setseq[lparms]; break; fin lparms++ until token <> COMMA_TKN - if (not lparms) or (token <> SET_TKN) + if not lparms or token <> SET_TKN // // Not a set list - free everything up // - tknptr = setptr - rewind(tknptr) + rewind(setptr) while lparms lparms-- release_seq(setseq[lparms]) @@ -565,9 +563,10 @@ def parse_set(codeseq) codeseq = gen_op(codeseq, DROP_CODE) next fin - for i = lparms-1 downto 0 - codeseq = cat_seq(codeseq, setseq[i]) - next + while lparms + lparms-- + codeseq = cat_seq(codeseq, setseq[lparms]) + loop return codeseq end def parse_stmnt @@ -691,6 +690,7 @@ def parse_stmnt if scan <> SET_TKN; exit_err(ERR_INVAL|ERR_STATE); fin seq, cfnvals = parse_expr(NULL) if !seq; exit_err(ERR_INVAL|ERR_STATE); fin + emit_seq(seq) if cfnvals > 1 parse_warn("Expression value overflow") while cfnvals > 1;cfnvals--; seq = gen_op(seq, DROP_CODE); loop @@ -815,8 +815,8 @@ def parse_stmnt for i = 1 to stack_loop emit_byte(DROP_CODE) next - seq, cfnvals = parse_expr(NULL) - if !seq; exit_err(ERR_INVAL|ERR_STATE); fin + seq, cfnvals = parse_list + emit_seq(seq) if cfnvals > infuncvals exit_err(ERR_OVER|ERR_CLOSE|ERR_STATE) elsif cfnvals < infuncvals @@ -935,6 +935,7 @@ def parse_struc#0 for idlen = 0 to struclen strucid[idlen] = ^(tknptr + idlen) next + scan fin offset = 0 while nextln == BYTE_TKN or token == WORD_TKN or token == EOL_TKN @@ -1095,15 +1096,19 @@ def parse_lambda // // Build an anonymous ID string for the Lambda function // - strcpy(@lambda_id[lambda_cnt * 8], "_LAMB__") - lambda_id[lambda_cnt * 8 + 6] = (lambda_num >> 3) & $07 + '0' - lambda_id[lambda_cnt * 8 + 7] = lambda_num & $07 + '0' - if lookup_idglobal(@lambda_id[lambda_cnt * 8], 7) >= 0 + //strcpy(@lambda_id[lambda_cnt * 4], "&00") + lambda_id[lambda_cnt * 4 + 0] = 3 + lambda_id[lambda_cnt * 4 + 1] = '&' + lambda_id[lambda_cnt * 4 + 2] = ((lambda_num >> 3) & $07) + '0' + lambda_id[lambda_cnt * 4 + 3] = (lambda_num & $07) + '0' + puts(@lambda_id[lambda_cnt * 4]); putln + lambda_num++ + if lookup_idglobal(@lambda_id[lambda_cnt * 4 + 1], 3) // // Lambda ID already exists (from failed scanning for '=') // func_tag = lambda_tag[lambda_cnt] - set_idfunc(@lambda_id[lambda_cnt * 8 + 1], 7, func_tag, cfnparms, 1) // Override any predef type & tag + set_idfunc(@lambda_id[lambda_cnt * 4 + 1], 3, func_tag, cfnparms, 1) // Override any predef type & tag else // // Creat new Lambda ID @@ -1111,7 +1116,7 @@ def parse_lambda func_tag = new_tag(WORD_FIXUP) lambda_tag[lambda_cnt] = func_tag lambda_cparms[lambda_cnt] = cfnparms - add_idfunc(@lambda_id[lambda_cnt * 8 + 1], 7, FUNC_TYPE, func_tag, cfnparms, 1) + add_idfunc(@lambda_id[lambda_cnt * 4 + 1], 3, FUNC_TYPE, func_tag, cfnparms, 1) fin lambda_cnt++ if lambda_cnt >= LAMBDANUM; parse_warn("Lambda function overflow"); fin diff --git a/src/toolsrc/plasm.pla b/src/toolsrc/plasm.pla index 4e69d7e..bb46132 100644 --- a/src/toolsrc/plasm.pla +++ b/src/toolsrc/plasm.pla @@ -231,11 +231,11 @@ end // // Generated code buffers // -const OPSEQNUM = 256 +const OPSEQNUM = 300 const TAGNUM = 1024 const FIXUPNUM = 2048 const IDGLOBALSZ = 2048 -const IDLOCALSZ = 512 +const IDLOCALSZ = 256 word fixup_cnt, tag_cnt = -1 word fixup_tag, fixup_addr word tag_addr, tag_type @@ -299,7 +299,7 @@ word infuncvals word break_tag word cont_tag byte lambda_cnt, lambda_num -byte[LAMBDANUM] lambda_id[8], lambda_cparms +byte[LAMBDANUM] lambda_id[4], lambda_cparms word[LAMBDANUM] lambda_seq word[LAMBDANUM] lambda_tag predef parse_constexpr#3, parse_expr(codeseq)#2, parse_lambda