1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-02-22 00:29:01 +00:00

value parsing cleanup

This commit is contained in:
David Schmenk 2018-01-06 22:29:12 -08:00
parent 30646b1d4b
commit 72463cb690
9 changed files with 109 additions and 110 deletions

View File

@ -126,9 +126,9 @@ $(PLVM03): vmsrc/plvm03.s vmsrc/soscmd.a
# Sample code
#
test: samplesrc/test.pla samplesrc/testlib.pla $(PLVM) $(PLASM)
./$(PLASM) -AMOW < samplesrc/test.pla > samplesrc/test.a
./$(PLASM) -AMW < samplesrc/test.pla > samplesrc/test.a
acme --setpc 4094 -o $(TEST) samplesrc/test.a
./$(PLASM) -AMOW < samplesrc/testlib.pla > samplesrc/testlib.a
./$(PLASM) -AMW < samplesrc/testlib.pla > samplesrc/testlib.a
acme --setpc 4094 -o $(TESTLIB) samplesrc/testlib.a
./$(PLVM) TEST

View File

@ -1,7 +1,3 @@
include "inc/cmdsys.plh"
repeat
puts("Hello, world.\n")
until ^$C000 < 128
^$C010
done

View File

@ -172,17 +172,29 @@ putln
puts(@constr); puti(constval); putln
puts("Signed byte constant:"); puti(-3); putln
puts("Hello from in-line string!\$7F\n")
puti(array:0); puts(" == "); puti(array:1); puts (" is "); puts(array:0 == array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <> "); puti(array:1); puts (" is "); puts(array:0 <> array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" >= "); puti(array:1); puts (" is "); puts(array:0 >= array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <= "); puti(array:1); puts (" is "); puts(array:0 <= array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" > "); puti(array:1); puts (" is "); puts(array:0 > array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" < "); puti(array:1); puts (" is "); puts(array:0 < array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" == "); puti(array:0); puts (" is "); puts(array:0 == array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <> "); puti(array:0); puts (" is "); puts(array:0 <> array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" >= "); puti(array:0); puts (" is "); puts(array:0 >= array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <= "); puti(array:0); puts (" is "); puts(array:0 <= array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" > "); puti(array:0); puts (" is "); puts(array:0 > array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" < "); puti(array:0); puts (" is "); puts(array:0 < array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" == "); puti(array:1); puts (" is ")
puts(array:0 == array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <> "); puti(array:1); puts (" is ")
puts(array:0 <> array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" >= "); puti(array:1); puts (" is ")
puts(array:0 >= array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <= "); puti(array:1); puts (" is ")
puts(array:0 <= array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" > "); puti(array:1); puts (" is ")
puts(array:0 > array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" < "); puti(array:1); puts (" is ")
puts(array:0 < array:1 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" == "); puti(array:0); puts (" is ")
puts(array:0 == array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <> "); puti(array:0); puts (" is ")
puts(array:0 <> array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" >= "); puti(array:0); puts (" is ")
puts(array:0 >= array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" <= "); puti(array:0); puts (" is ")
puts(array:0 <= array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" > "); puti(array:0); puts (" is ")
puts(array:0 > array:0 ?? "TRUE\n" :: "FALSE\n")
puti(array:0); puts(" < "); puti(array:0); puts (" is ")
puts(array:0 < array:0 ?? "TRUE\n" :: "FALSE\n")
ptr = 0
done

View File

@ -362,7 +362,7 @@ def emit_seq(seq)#0
// We must also force output if the sequence includes a CS opcode, as the
// associated 'constant' is only temporarily valid.
//
if (not (outflags & (OPTIMIZE|OPTIMIZE2))) or (outflags & NO_COMBINE) or string
if not (outflags & (OPTIMIZE|OPTIMIZE2)) or outflags & NO_COMBINE or string
emit_pending_seq
fin
end

View File

@ -425,7 +425,7 @@ t_token scan(void)
}
void scan_rewind(char *backptr)
{
scanpos = backptr;
scanpos = tokenstr = backptr;
}
int scan_lookahead(void)
{

View File

@ -132,31 +132,32 @@ def scan
// String constant
//
token = STR_TKN
constval = @strconst+1
strconst = 0
constval = strconstptr
^constval = 0
strconstptr++
scanptr++
while ^scanptr and ^scanptr <> '"'
if ^scanptr <> '\\'
^constval = ^scanptr
^strconstptr = ^scanptr
else
scanptr++
when ^scanptr
is 'n'
^constval = $0D; break
^strconstptr = $0D; break
is 'r'
^constval = $0A; break
^strconstptr = $0A; break
is 't'
^constval = $09; break
^strconstptr = $09; break
otherwise
^constval = ^scanptr
^strconstptr = ^scanptr
wend
fin
constval++
strconst++
strconstptr++
^constval++
scanptr++
loop
if not ^scanptr; exit_err(ERR_INVAL|ERR_CONST); fin
constval = @strconst
strconstptr++
scanptr++
break
is '/'
@ -265,6 +266,7 @@ def scan
end
def rewind(ptr)#0
scanptr = ptr
tknptr = ptr
end
def lookahead
word backptr, backtkn
@ -284,6 +286,7 @@ end
// Get next line of input
//
def nextln
strconstptr = @strconst // Reset string constant buffer
if ^scanptr == ';'
scanptr++
scan

View File

@ -465,31 +465,33 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
valseq = cat_seq(parse_list(NULL, &value), valseq);
if (scantoken != CLOSE_PAREN_TOKEN)
parse_error("Missing function call closing parenthesis");
if (!(type & FUNC_TYPE)) // Can't check parm count on function pointers
cfnparms = value;
else if (cfnparms != value)
if (type & FUNC_TYPE)
{
if (cfnparms != value) // Can't check parm count on function pointers
parse_error("Parameter count mismatch");
}
else
{
if (scan() == POUND_TOKEN)
{
/*
* Set function pointer return vals count - can't do this to regular function call
*/
if (type & FUNC_TYPE)
parse_error("Overriding function return count");
if (!parse_const(&cfnvals))
parse_error("Invalid def return value count");
}
else
scan_rewind(tokenstr);
if (type & (VAR_TYPE | PTR_TYPE)) //!(type & (FUNC_TYPE | CONST_TYPE)))
if (type & (VAR_TYPE | PTR_TYPE))
{
valseq = gen_lw(valseq);
if (deref)
deref--;
}
}
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - value - 1;
*stackdepth += cfnvals - 1;
cfnparms = 0; cfnvals = 1;
type &= ~(FUNC_TYPE | VAR_TYPE);
}
@ -501,13 +503,10 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
if (type & FUNC_TYPE)
{
/*
* Function call dereference
* Function address dereference
*/
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - 1;
cfnparms = 0; cfnvals = 1;
type &= ~FUNC_TYPE;
type = BPTR_TYPE;
}
while ((valseq = parse_expr(valseq, stackdepth)) && scantoken == COMMA_TOKEN)
{
@ -537,9 +536,11 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
/*
* Function call dereference
*/
if (cfnparms)
parse_error("Parameter count mismatch");
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - 1;
*stackdepth += cfnvals - 1;
cfnparms = 0; cfnvals = 1;
type &= ~FUNC_TYPE;
}
@ -553,8 +554,6 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
type = (scantoken == PTRB_TOKEN) ? BPTR_TYPE : WPTR_TYPE;
if (!parse_const(&const_offset))
{
if (scantoken == EOL_TOKEN || scantoken == CLOSE_PAREN_TOKEN)
parse_error("Syntax");
/*
* Setting type override for following operations
*/
@ -577,21 +576,16 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
if (type & FUNC_TYPE)
{
/*
* Function call dereference
* Function address dereference
*/
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - 1;
cfnparms = 0; cfnvals = 1;
type &= ~FUNC_TYPE;
type = 0;
}
type = (type & (VAR_TYPE | CONST_TYPE))
? ((scantoken == DOT_TOKEN) ? BYTE_TYPE : WORD_TYPE)
: ((scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE);
if (!parse_const(&const_offset))
{
if (scantoken == EOL_TOKEN || scantoken == CLOSE_PAREN_TOKEN)
parse_error("Syntax");
/*
* Setting type override for following operations
*/
@ -617,9 +611,11 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
deref--;
if (type & FUNC_TYPE)
{
if (cfnparms)
parse_error("Parameter count mismatch");
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - 1;
*stackdepth += cfnvals - 1;
cfnparms = 0; cfnvals = 1;
type &= ~FUNC_TYPE;
}
@ -630,9 +626,11 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
{
if (type & FUNC_TYPE)
{
if (cfnparms)
parse_error("Parameter count mismatch");
valseq = gen_icall(valseq);
if (stackdepth)
*stackdepth += cfnvals + cfnparms - 1;
*stackdepth += cfnvals - 1;
cfnparms = 0; cfnvals = 1;
type &= ~FUNC_TYPE;
}
@ -750,8 +748,7 @@ t_opseq *parse_set(t_opseq *codeseq)
}
if (lparms == 0 || scantoken != SET_TOKEN)
{
tokenstr = setptr;
scan_rewind(tokenstr);
scan_rewind(setptr);
while (lparms--)
release_seq(setseq[lparms]);
while (lambda_cnt > lambda_set)
@ -772,8 +769,8 @@ t_opseq *parse_set(t_opseq *codeseq)
for (i = rparms - lparms; i > 0; i--)
codeseq = gen_drop(codeseq);
}
for (i = lparms - 1; i >= 0; i--)
codeseq = cat_seq(codeseq, setseq[i]);
while (lparms--)
codeseq = cat_seq(codeseq, setseq[lparms]);
return (codeseq);
}
int parse_stmnt(void)
@ -1076,7 +1073,7 @@ int parse_stmnt(void)
scan_rewind(idptr);
emit_seq(parse_value(NULL, LVALUE, NULL));
}
else if (scantoken != SET_TOKEN)
else
{
while (stackdepth)
{
@ -1085,8 +1082,6 @@ int parse_stmnt(void)
}
emit_seq(rseq);
}
else
parse_error("Invalid LVALUE");
}
else
parse_error("Syntax error");

View File

@ -329,23 +329,22 @@ def parse_value(codeseq, rvalue)#2
idxseq, value = parse_list
valseq = cat_seq(idxseq, valseq)
if token <> CLOSE_PAREN_TKN; exit_err(ERR_MISS|ERR_CLOSE|ERR_SYNTAX); fin
if type & FUNC_TYPE
if type & FUNC_TYPE // Can't check parm count on function pointers
if cfnparms <> value; exit_err(ERR_MISS|ERR_ID); fin
else // Can't check parm count on function pointers
cfnparms = value
fin
else
if scan == POUND_TKN // Set function pointer return vals count - can't do this to regular function call
if type & FUNC_TYPE; exit_err(ERR_INVAL|ERR_SYNTAX); fin
if not parse_const(@cfnvals); exit_err(ERR_INVAL|ERR_CONST); fin
if not parse_const(@value); exit_err(ERR_INVAL|ERR_CONST); fin
cfnvals = value
else
rewind(tknptr)
fin
if type & (VAR_TYPE | PTR_TYPE) // !(type & (FUNC_TYPE | CONST_TYPE)))
if type & (VAR_TYPE | PTR_TYPE)
valseq = gen_op(valseq, LW_CODE)
if deref; deref--; fin
fin
fin
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - value - 1
stackdepth = stackdepth + cfnvals - 1
cfnparms = 0
cfnvals = 1
type = type & ~(FUNC_TYPE | VAR_TYPE)
@ -354,12 +353,10 @@ def parse_value(codeseq, rvalue)#2
//
// Array of arrays
//
if type & FUNC_TYPE // Function call dereference
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - 1
if type & FUNC_TYPE // Function address dereference
cfnparms = 0
cfnvals = 1
type = type & ~FUNC_TYPE
type = BPTR_TYPE
fin
repeat
valseq, drop = parse_expr(valseq)
@ -382,8 +379,9 @@ def parse_value(codeseq, rvalue)#2
// Structure member pointer
//
if type & FUNC_TYPE // Function call dereference
if cfnparms; exit_err(ERR_MISS|ERR_ID); fin
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - 1
stackdepth = stackdepth + cfnvals - 1
cfnparms = 0
cfnvals = 1
type = type & ~FUNC_TYPE
@ -392,11 +390,10 @@ def parse_value(codeseq, rvalue)#2
fin
type = token == PTRB_TKN ?? BPTR_TYPE :: WPTR_TYPE
if not parse_const(@const_offset)
if token == EOL_TKN or token == CLOSE_PAREN_TKN; exit_err(ERR_SYNTAX); fin
rewind(tknptr) // Setting type override for following operations
elsif const_offset <> 0
valseq = gen_const(valseq, const_offset) // Structure member pointer
valseq = gen_op(valseq, ADD_TKN)
valseq = gen_op(valseq, ADD_CODE)
fin
break
is DOT_TKN
@ -404,12 +401,10 @@ def parse_value(codeseq, rvalue)#2
//
// Structure member offset
//
if type & FUNC_TYPE // Function call dereference
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - 1
if type & FUNC_TYPE // Function address dereference
cfnparms = 0
cfnvals = 1
type = type & ~FUNC_TYPE
type = VAR_TYPE
fin
if type & (VAR_TYPE | CONST_TYPE)
type = token == DOT_TKN ?? BYTE_TYPE :: WORD_TYPE
@ -417,11 +412,10 @@ def parse_value(codeseq, rvalue)#2
type = token == DOT_TKN ?? BPTR_TYPE :: WPTR_TYPE
fin
if not parse_const(@const_offset)
if token == EOL_TKN or token == CLOSE_PAREN_TKN; exit_err(ERR_SYNTAX); fin
rewind(tknptr) // Setting type override for following operations
elsif const_offset <> 0
valseq = gen_const(valseq, const_offset) // Structure member offset
valseq = gen_op(valseq, ADD_TKN)
valseq = gen_op(valseq, ADD_CODE)
fin
break
otherwise
@ -434,8 +428,9 @@ def parse_value(codeseq, rvalue)#2
while deref > rvalue
deref--
if type & FUNC_TYPE
if cfnparms; exit_err(ERR_MISS|ERR_ID); fin
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - 1
stackdepth = stackdepth + cfnvals - 1
cfnparms = 0
cfnvals = 1
type = type & ~FUNC_TYPE;
@ -445,8 +440,9 @@ def parse_value(codeseq, rvalue)#2
loop
if deref
if type & FUNC_TYPE
if cfnparms; exit_err(ERR_MISS|ERR_ID); fin
valseq = gen_op(valseq, ICAL_CODE)
stackdepth = stackdepth + cfnvals + cfnparms - 1
stackdepth = stackdepth + cfnvals - 1
type = type & ~FUNC_TYPE
elsif type & (BYTE_TYPE | BPTR_TYPE)
valseq = gen_op(valseq, LB_CODE)
@ -869,14 +865,13 @@ def parse_stmnt
rewind(idptr)
seq, drop = parse_value(NULL, LVALUE)
emit_seq(seq)
elsif token <> SET_TKN
else
if cfnvals > 100;puth(cfnvals);puts(instr);putln;fin
while cfnvals > 1
seq = cat_seq(seq, gen_op(NULL, DROP_CODE))
cfnvals--
loop
emit_seq(seq)
else
exit_err(ERR_INVAL|ERR_STATE)
fin
else
exit_err(ERR_SYNTAX)
@ -997,9 +992,8 @@ def parse_vars(type)
is EXPORT_TKN
if type & (EXTERN_TYPE|LOCAL_TYPE); exit_err(ERR_INVAL|ERR_LOCAL|ERR_SYNTAX); fin
type = EXPORT_TYPE
idptr = tknptr
if scan <> BYTE_TKN and token <> WORD_TKN // This could be an exported definition
rewind(idptr)
rewind(tknptr)
scan
return FALSE
fin
@ -1096,12 +1090,10 @@ def parse_lambda
//
// Build an anonymous ID string for the Lambda function
//
//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)
//

View File

@ -291,7 +291,8 @@ word lineno
const LVALUE = 0
const RVALUE = 1
const LAMBDANUM = 16
byte[128] strconst
byte[80] strconst
word strconstptr
byte infunc
byte stack_loop
byte prevstmnt