1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-07-05 04:28:57 +00:00

Clean up parse_value/fix parse bugs

This commit is contained in:
David Schmenk 2015-01-11 10:11:47 -08:00
parent 55f4035122
commit 352bf0439c
3 changed files with 205 additions and 244 deletions

View File

@ -326,15 +326,16 @@ int parse_value(int rvalue)
{
if (!emit_value)
{
if (ref_type & VAR_TYPE)
if (type & CONST_TYPE)
emit_const(value);
else if (type & VAR_TYPE)
{
if (type & LOCAL_TYPE)
emit_llw(value + ref_offset);
else
emit_law(value, ref_offset, type);
ref_offset = 0;
}
if (ref_type & PTR_TYPE)
(type & BPTR_TYPE) ? emit_lb() : emit_lw();
}
else
if (cparams)
@ -342,7 +343,7 @@ int parse_value(int rvalue)
emit_ical();
}
emit_value = 1;
ref_type = WORD_TYPE;
ref_type = 0;
break;
case OPEN_BRACKET_TOKEN:
/*
@ -350,24 +351,23 @@ int parse_value(int rvalue)
*/
if (!emit_value)
{
if (type & ADDR_TYPE)
if (type & CONST_TYPE)
emit_const(value);
else if (type & ADDR_TYPE)
{
if (type & LOCAL_TYPE)
emit_localaddr(value + ref_offset);
else
emit_globaladdr(value, ref_offset, type);
ref_offset = 0;
}
else if (type & CONST_TYPE)
else
{
emit_const(value);
parse_error("Bad index reference");
return (0);
}
if (type & PTR_TYPE)
(type & BPTR_TYPE) ? emit_lb() : emit_lw();
ref_offset = 0;
emit_value = 1;
}
else if (ref_type & PTR_TYPE)
(ref_type & BPTR_TYPE) ? emit_lb() : emit_lw();
while (parse_expr())
{
if (scantoken != COMMA_TOKEN)
@ -398,25 +398,17 @@ int parse_value(int rvalue)
*/
if (!emit_value)
{
if (type & FUNC_TYPE)
emit_call(value, type);
else if (type & VAR_TYPE)
if (type & CONST_TYPE)
emit_const(value);
else if (type & ADDR_TYPE)
{
if (type & LOCAL_TYPE)
(type & BYTE_TYPE) ? emit_llb(value + ref_offset) : emit_llw(value + ref_offset);
(ref_type & BYTE_TYPE) ? emit_llb(value + ref_offset) : emit_llw(value + ref_offset);
else
(type & BYTE_TYPE) ? emit_lab(value, ref_offset, type) : emit_law(value, ref_offset, type);
(ref_type & BYTE_TYPE) ? emit_lab(value, ref_offset, type) : emit_law(value, ref_offset, type);
}
else if (type & CONST_TYPE)
{
emit_const(value);
}
if (type & PTR_TYPE)
(type & BPTR_TYPE) ? emit_lb() : emit_lw();
emit_value = 1;
}
else
(ref_type & BPTR_TYPE) ? emit_lb() : emit_lw();
ref_type = (scantoken == PTRB_TOKEN) ? BPTR_TYPE : WPTR_TYPE;
ref_offset = 0;
if (!parse_constval(&ref_offset, &const_size))
@ -425,15 +417,15 @@ int parse_value(int rvalue)
{
emit_const(ref_offset);
emit_op(ADD_TOKEN);
ref_offset = 0;
}
ref_offset = 0;
break;
case DOT_TOKEN:
case COLON_TOKEN:
/*
* Structure member offset
*/
ref_type = (ref_type & VAR_TYPE)
ref_type = (ref_type & (VAR_TYPE | CONST_TYPE))
? ((scantoken == DOT_TOKEN) ? BYTE_TYPE : WORD_TYPE)
: ((scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE);
if (parse_constval(&const_offset, &const_size))
@ -442,18 +434,17 @@ int parse_value(int rvalue)
scan_rewind(tokenstr);
if (!emit_value)
{
if (type & FUNC_TYPE)
if (type & CONST_TYPE)
{
value += ref_offset;
ref_offset = 0;
}
else if (type & FUNC_TYPE)
{
emit_globaladdr(value, ref_offset, type);
ref_offset = 0;
emit_value = 1;
}
else if (type & CONST_TYPE)
{
value += ref_offset;
ref_offset = 0;
ref_type = type;
}
}
else
{
@ -474,11 +465,15 @@ int parse_value(int rvalue)
}
else
{
if (ref_type & CONST_TYPE)
emit_const(value);
else if (deref)
if (deref)
{
if (ref_type & FUNC_TYPE)
if (type & CONST_TYPE)
{
emit_const(value);
if (ref_type & VAR_TYPE)
(ref_type & BYTE_TYPE) ? emit_lb() : emit_lw();
}
else if (type & FUNC_TYPE)
emit_call(value, ref_type);
else if (type & VAR_TYPE)
{
@ -487,12 +482,12 @@ int parse_value(int rvalue)
else
(ref_type & BYTE_TYPE) ? emit_lab(value, ref_offset, ref_type) : emit_law(value, ref_offset, ref_type);
}
else if (ref_type & PTR_TYPE)
(ref_type & BPTR_TYPE) ? emit_lb() : emit_lw();
}
else
{
if (type & LOCAL_TYPE)
if (type & CONST_TYPE)
emit_const(value);
else if (type & LOCAL_TYPE)
emit_localaddr(value + ref_offset);
else
emit_globaladdr(value, ref_offset, ref_type);

View File

@ -2959,15 +2959,14 @@ end
def parse_value(rvalue)
byte cparams, deref, type, emit_val
word optos, idptr, value
byte elem_size, elem_type
word elem_offset
byte const_size, ref_type
word ref_offset, const_offset
deref = rvalue
optos = opsp
type = 0
elem_offset = 0
emit_val = FALSE
value = 0
deref = rvalue
optos = opsp
type = 0
emit_val = FALSE
value = 0
//
// Parse pre-ops
@ -3054,170 +3053,17 @@ def parse_value(rvalue)
//
// Parse post-ops
//
ref_type = type
ref_offset = 0
while ispostop
when token
is OPEN_BRACKET_TKN
//
// Array
//
if !emit_val
if type & ADDR_TYPE
if type & LOCAL_TYPE
emit_localaddr(value)
else
emit_globaladdr(value, 0)
fin
elsif type & CONST_TYPE
emit_const(value)
fin
emit_val = TRUE
fin // !emit_val
if type & PTR_TYPE
emit_lw
fin
if !parse_expr
return 0
fin
if token <> CLOSE_BRACKET_TKN
return parse_err(@no_close_bracket)
fin
if type & WORD_TYPE
type = WPTR_TYPE
emit_indexword
else
type = BPTR_TYPE
emit_indexbyte
fin
break
is PTRB_TKN
is PTRW_TKN
if !emit_val
if type & FUNC_TYPE
emit_call(value)
elsif type & VAR_TYPE
if type & LOCAL_TYPE
if type & BYTE_TYPE
emit_llb(value + elem_offset)
else
emit_llw(value + elem_offset)
fin
else
if type & BYTE_TYPE
emit_lab(value, elem_offset)
else
emit_law(value, elem_offset)
fin
fin
else
if type & BPTR_TYPE
emit_lb
else
emit_lw
fin
fin
emit_val = 1;
else
if type & BYTE_TYPE
emit_lab(value, elem_offset)
else
emit_law(value, elem_offset)
fin
fin
type = type & ~(VAR_TYPE | ADDR_TYPE)
type = type | WORD_TYPE
if token == PTRB_TKN
token = DOT_TKN
else
token = COLON_TKN
fin
//
// Fall through
//
is DOT_TKN
is COLON_TKN
//
// Dot and Colon
//
if token == DOT_TKN
elem_type = BPTR_TYPE
else
elem_type = WPTR_TYPE
fin
if parse_constval(@elem_offset, @elem_size)
//
// Constant structure offset
//
if !emit_val
if type & VAR_TYPE
if elem_type & BPTR_TYPE
elem_type = (type & ~VAR_TYPE) | BYTE_TYPE
else
elem_type = (type & ~VAR_TYPE) | WORD_TYPE
fin
elsif type & CONST_TYPE
value = value + elem_offset
emit_const(value)
elem_offset = 0
emit_val = TRUE
else // FUNC_TYPE
emit_globaladdr(value, 0)
emit_const(elem_offset)
emit_binaryop(ADD_TKN)
elem_offset = 0
emit_val = TRUE
fin
else
if elem_offset
emit_const(elem_offset)
emit_binaryop(ADD_TKN)
elem_offset = 0
fin
fin // !emit_val
elsif token == OPEN_BRACKET_TKN
//
// Array of arrays
//
if !emit_val
if type & ADDR_TYPE
if type & LOCAL_TYPE
emit_localaddr(value + elem_offset)
else
emit_globaladdr(value, elem_offset)
fin
elsif type & CONST_TYPE
emit_const(value + elem_offset)
fin
elem_offset = 0
emit_val = TRUE
fin // !emit_val
while parse_expr
if token <> COMMA_TKN
break
fin
emit_indexword
emit_lw
loop
if token <> CLOSE_BRACKET_TKN
return parse_err(@no_close_bracket)
fin
if elem_type & WPTR_TYPE
emit_indexword
else
emit_indexbyte
fin
else
return parse_err(@bad_offset)
fin
type = elem_type
break
is OPEN_PAREN_TKN
//
// Function call
//
if emit_val
if type & PTR_TYPE
emit_lw
fin
if ref_type & BPTR_TYPE; emit_lb
elsif ref_type & WPTR_TYPE; emit_lw; fin
if lookahead <> CLOSE_PAREN_TKN
emit_push
fin
@ -3232,18 +3078,19 @@ def parse_value(rvalue)
if token <> CLOSE_PAREN_TKN
return parse_err(@no_close_paren)
fin
if type & FUNC_CONST_TYPE
if ref_type & FUNC_CONST_TYPE
emit_call(value)
else
if !emit_val
if type & VAR_TYPE
if ref_type & CONST_TYPE
emit_const(value)
elsif ref_type & VAR_TYPE
if type & LOCAL_TYPE
emit_llw(value + elem_offset)
emit_llw(value + ref_offset)
else
emit_law(value, elem_offset)
emit_law(value, ref_offset)
fin
elsif type & PTR_TYPE
emit_lw
ref_offset = 0
fin
else
if cparams
@ -3253,13 +3100,129 @@ def parse_value(rvalue)
emit_ical
fin
emit_val = TRUE
type = WORD_TYPE
ref_type = 0
break
is OPEN_BRACKET_TKN
//
// Array of arrays
//
if !emit_val
if type & CONST_TYPE
emit_const(value)
elsif type & ADDR_TYPE
if type & LOCAL_TYPE
emit_localaddr(value + ref_offset)
else
emit_globaladdr(value, ref_offset)
fin
ref_offset = 0
fin
emit_val = TRUE
fin
while parse_expr
if token <> COMMA_TKN
break
fin
emit_indexword
emit_lw
loop
if token <> CLOSE_BRACKET_TKN
return parse_err(@no_close_bracket)
fin
if ref_type & (WPTR_TYPE | WORD_TYPE)
emit_indexword
ref_type = WPTR_TYPE
else
emit_indexbyte
ref_type = BPTR_TYPE
fin
break
is PTRB_TKN
is PTRW_TKN
//
// Structure member pointer
//
if !emit_val
if (type & CONST_TYPE)
emit_const(value)
elsif type & ADDR_TYPE
if type & LOCAL_TYPE
if ref_type & BYTE_TYPE
emit_llb(value + ref_offset)
else
emit_llw(value + ref_offset)
fin
else
if ref_type & BYTE_TYPE
emit_lab(value, ref_offset)
else
emit_law(value, ref_offset)
fin
fin
fin
emit_val = 1;
fin
if token == PTRB_TKN
ref_type = BPTR_TYPE
else
ref_type = WPTR_TYPE
fin
ref_offset = 0
if !parse_constval(@ref_offset, @const_size)
rewind(tknptr)
fin
if ref_offset <> 0
emit_const(ref_offset)
emit_op($02)
ref_offset = 0
fin
break
is DOT_TKN
is COLON_TKN
//
// Structure member offset
//
if ref_type & (VAR_TYPE | CONST_TYPE)
if token == DOT_TKN
ref_type = BYTE_TYPE
else
ref_type = WORD_TYPE
fin
else
if token == DOT_TKN
ref_type = BPTR_TYPE
else
ref_type = WPTR_TYPE
fin
fin
if parse_constval(@const_offset, @const_size)
ref_offset = ref_offset + const_offset
else
rewind(tknptr)
fin
if !emit_val
if type & CONST_TYPE
value = value + ref_offset
ref_offset = 0
elsif type & FUNC_TYPE
emit_globaladdr(value, ref_offset)
ref_offset = 0
emit_val = TRUE
fin
else
if ref_offset <> 0
emit_const(ref_offset)
emit_op($02)
ref_offset = 0
fin
fin
break
wend
loop
if emit_val
if rvalue
if deref and type & PTR_TYPE
if type & BPTR_TYPE
if deref and ref_type & PTR_TYPE
if ref_type & BPTR_TYPE
emit_lb
else
emit_lw
@ -3267,47 +3230,50 @@ def parse_value(rvalue)
fin
fin
else // emit_val
if type & CONST_TYPE
emit_const(value)
elsif deref
if type & FUNC_TYPE
emit_call(value)
elsif type & VAR_TYPE
if type & LOCAL_TYPE
if type & BYTE_TYPE
emit_llb(value + elem_offset)
if deref
if ref_type & CONST_TYPE
emit_const(value)
if ref_type & VAR_TYPE
if ref_type & BYTE_TYPE
emit_lb()
else
emit_llw(value + elem_offset)
fin
else
if type & BYTE_TYPE
emit_lab(value, elem_offset)
else
emit_law(value, elem_offset)
emit_lw()
fin
fin
elsif type & PTR_TYPE
if type & BPTR_TYPE
emit_lb
elsif ref_type & FUNC_TYPE
emit_call(value)
elsif ref_type & VAR_TYPE
if type & LOCAL_TYPE
if ref_type & BYTE_TYPE
emit_llb(value + ref_offset)
else
emit_llw(value + ref_offset)
fin
else
emit_lw
if ref_type & BYTE_TYPE
emit_lab(value, ref_offset)
else
emit_law(value, ref_offset)
fin
fin
fin
else
if type & LOCAL_TYPE
emit_localaddr(value + elem_offset)
if type & CONST_TYPE
emit_const(value)
elsif type & LOCAL_TYPE
emit_localaddr(value + ref_offset)
else
emit_globaladdr(value, elem_offset)
emit_globaladdr(value, ref_offset)
fin
fin
fin // emit_val
while optos < opsp
if !emit_unaryop(pop_op); return parse_err(@bad_op); fin
loop
if !type
type = WORD_TYPE
if !ref_type
ref_type = WORD_TYPE
fin
return type
return ref_type
end
def parse_constexpr(valptr, sizeptr)
byte type, size1, size2

View File

@ -1132,9 +1132,9 @@ def catalog(optpath)
if read(refnum, databuff, 512) == 512
entry = databuff + 4
if firstblk
entrylen = databuff->$23
entriesblk = databuff->$24
filecnt = databuff=>$25
entrylen = databuff.$23
entriesblk = databuff.$24
filecnt = databuff:$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk