mirror of
https://github.com/uffejakobsen/acme.git
synced 2025-02-20 18:28:55 +00:00
updated error messages
git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@190 4df02467-bbd4-4a76-a152-e7ce94205b78
This commit is contained in:
parent
64a4b336b0
commit
98ae73381d
@ -50,6 +50,12 @@ Assembling unstable LXA #NONZERO instruction
|
|||||||
Therefore ACME issues these warnings if it is about to generate
|
Therefore ACME issues these warnings if it is about to generate
|
||||||
these instructions with a non-zero argument.
|
these instructions with a non-zero argument.
|
||||||
|
|
||||||
|
Binary literal without any digits.
|
||||||
|
Hex literal without any digits.
|
||||||
|
Octal literal without any digits.
|
||||||
|
A special literal was started, but then no digits followed. Expect
|
||||||
|
this to become an error in future!
|
||||||
|
|
||||||
Bug in ACME, code follows
|
Bug in ACME, code follows
|
||||||
A situation has been encountered implying there is a bug in ACME.
|
A situation has been encountered implying there is a bug in ACME.
|
||||||
See the last section in this file.
|
See the last section in this file.
|
||||||
@ -108,19 +114,21 @@ Output file already chosen.
|
|||||||
Segment reached another one, overwriting it.
|
Segment reached another one, overwriting it.
|
||||||
The program counter has just reached the start of another segment.
|
The program counter has just reached the start of another segment.
|
||||||
Because some people might want to assemble "onto" a binary file
|
Because some people might want to assemble "onto" a binary file
|
||||||
that was loaded before, this warning can be switched off using
|
that was loaded before, this warning can be inhibited using
|
||||||
modifier keywords when changing the program counter via "*=".
|
modifier keywords when changing the program counter via "*=".
|
||||||
Future versions of ACME might throw an error instead of a warning
|
For extra safety you can also turn this warning into an error
|
||||||
in this case.
|
using the "--strict-segments" CLI switch. In future versions of
|
||||||
|
ACME this might become the default.
|
||||||
|
|
||||||
Segment starts inside another one, overwriting it.
|
Segment starts inside another one, overwriting it.
|
||||||
The given value in a "*=" command is located inside another
|
The given value in a "*=" command is located inside another
|
||||||
segment. Because some people might want to assemble "onto" a
|
segment. Because some people might want to assemble "onto" a
|
||||||
binary file that was loaded before, this warning can be switched
|
binary file that was loaded before, this warning can be inhibited
|
||||||
off using modifier keywords when changing the program counter via
|
using modifier keywords when changing the program counter via
|
||||||
"*=".
|
"*=".
|
||||||
Future versions of ACME might throw an error instead of a warning
|
For extra safety you can also turn this warning into an error
|
||||||
in this case.
|
using the "--strict-segments" CLI switch. In future versions of
|
||||||
|
ACME this might become the default.
|
||||||
|
|
||||||
Symbol list file name already chosen.
|
Symbol list file name already chosen.
|
||||||
The "!sl" command was given more than once (or in addition to the
|
The "!sl" command was given more than once (or in addition to the
|
||||||
@ -193,6 +201,9 @@ Section: Errors during assembly
|
|||||||
This is given when the pseudo opcode "!error" is executed. The
|
This is given when the pseudo opcode "!error" is executed. The
|
||||||
actual message varies according to the pseudo opcode's arguments.
|
actual message varies according to the pseudo opcode's arguments.
|
||||||
|
|
||||||
|
Argument out of range.
|
||||||
|
You called arcsin/arccos with something not in the [-1, 1] range.
|
||||||
|
|
||||||
Cannot open input file.
|
Cannot open input file.
|
||||||
ACME had problems opening an input file ("!bin", "!convtab" or
|
ACME had problems opening an input file ("!bin", "!convtab" or
|
||||||
"!src"). Maybe you mistyped its name.
|
"!src"). Maybe you mistyped its name.
|
||||||
@ -208,6 +219,10 @@ Exponent is negative.
|
|||||||
Using negative exponents only give sensible results when using
|
Using negative exponents only give sensible results when using
|
||||||
floating point maths.
|
floating point maths.
|
||||||
|
|
||||||
|
Expression did not return a number.
|
||||||
|
An expression returned a string or a list but a number (integer or
|
||||||
|
float) was expected.
|
||||||
|
|
||||||
File name quotes not found ("" or <>).
|
File name quotes not found ("" or <>).
|
||||||
File names have to be given in quotes. Either "" quoting for files
|
File names have to be given in quotes. Either "" quoting for files
|
||||||
located in the current directory or <> quoting for library files.
|
located in the current directory or <> quoting for library files.
|
||||||
@ -216,8 +231,9 @@ Found '}' instead of end-of-file.
|
|||||||
ACME encountered a '}' character when it expected the file to end
|
ACME encountered a '}' character when it expected the file to end
|
||||||
instead (because no blocks were open).
|
instead (because no blocks were open).
|
||||||
|
|
||||||
Garbage data at end of statement.
|
Garbage data at end of statement (unexpected 'CHAR').
|
||||||
There are still arguments when there should not be any more.
|
There are still arguments when there should not be any more. The
|
||||||
|
given character is the one where end-of-line was expected.
|
||||||
|
|
||||||
Hex digits are not given in pairs.
|
Hex digits are not given in pairs.
|
||||||
The two digits of a hex byte are separated by another character,
|
The two digits of a hex byte are separated by another character,
|
||||||
@ -234,6 +250,12 @@ Illegal combination of command and postfix.
|
|||||||
Illegal postfix.
|
Illegal postfix.
|
||||||
You used a postfix other than "+1", "+2" or "+3".
|
You used a postfix other than "+1", "+2" or "+3".
|
||||||
|
|
||||||
|
Index is undefined.
|
||||||
|
You attempted an indexing operation with some undefined symbol.
|
||||||
|
|
||||||
|
Index out of range.
|
||||||
|
The value for an indexing operation wasn't in the allowed range.
|
||||||
|
|
||||||
Macro already defined.
|
Macro already defined.
|
||||||
Macros can only be defined once. If you define a macro twice, ACME
|
Macros can only be defined once. If you define a macro twice, ACME
|
||||||
will help you find the definitions by giving a warning for the
|
will help you find the definitions by giving a warning for the
|
||||||
@ -265,6 +287,13 @@ No string given.
|
|||||||
|
|
||||||
Number out of range.
|
Number out of range.
|
||||||
A value is too high or too low.
|
A value is too high or too low.
|
||||||
|
This can also mean the desired addressing mode is not available,
|
||||||
|
as in "ldy $e000, x".
|
||||||
|
|
||||||
|
Operation not supported: Cannot apply "OP" to "TYPE".
|
||||||
|
Operation not supported: Cannot apply "OP" to "TYPE" and "TYPE".
|
||||||
|
You tried to use an operator on the wrong type(s) of argument(s),
|
||||||
|
like indexing a float or negating a string.
|
||||||
|
|
||||||
Program counter is unset.
|
Program counter is unset.
|
||||||
You didn't set the program counter, so ACME didn't know where to
|
You didn't set the program counter, so ACME didn't know where to
|
||||||
@ -305,12 +334,12 @@ Too late for postfix.
|
|||||||
Too many '('.
|
Too many '('.
|
||||||
A formula ends before all parentheses were closed.
|
A formula ends before all parentheses were closed.
|
||||||
|
|
||||||
Too many ')'.
|
|
||||||
There are more closing than opening parentheses in a formula.
|
|
||||||
|
|
||||||
Unknown encoding.
|
Unknown encoding.
|
||||||
You used the "!convtab" command with a keyword ACME does not know.
|
You used the "!convtab" command with a keyword ACME does not know.
|
||||||
|
|
||||||
|
Unknown function.
|
||||||
|
You used a mathematical function ACME does not know.
|
||||||
|
|
||||||
Unknown operator.
|
Unknown operator.
|
||||||
You used an arithmetic/logical operator ACME does not know.
|
You used an arithmetic/logical operator ACME does not know.
|
||||||
|
|
||||||
@ -326,6 +355,12 @@ Unknown pseudo opcode.
|
|||||||
Unknown "* =" segment modifier.
|
Unknown "* =" segment modifier.
|
||||||
You used a modifier keyword ACME does not know.
|
You used a modifier keyword ACME does not know.
|
||||||
|
|
||||||
|
Unterminated index spec.
|
||||||
|
An index was started with '[' but did not end with ']'.
|
||||||
|
|
||||||
|
Unterminated list.
|
||||||
|
A list was started with '[' but did not end with ']'.
|
||||||
|
|
||||||
Value not defined (SYMBOL NAME).
|
Value not defined (SYMBOL NAME).
|
||||||
A value could not be worked out. Maybe you mistyped a symbol name.
|
A value could not be worked out. Maybe you mistyped a symbol name.
|
||||||
Whether this is given as a "normal" or as a serious error depends
|
Whether this is given as a "normal" or as a serious error depends
|
||||||
@ -374,12 +409,15 @@ Syntax error.
|
|||||||
|
|
||||||
Too deeply nested. Recursive macro calls?
|
Too deeply nested. Recursive macro calls?
|
||||||
The only reason for ACME to have a limit on macro call nesting
|
The only reason for ACME to have a limit on macro call nesting
|
||||||
at all is to find infinite recursions. Current limit is 64.
|
at all is to find infinite recursions.
|
||||||
|
The default limit is 64, this can be changed using the
|
||||||
|
"--maxdepth" CLI switch.
|
||||||
|
|
||||||
Too deeply nested. Recursive "!source"?
|
Too deeply nested. Recursive "!source"?
|
||||||
The only reason for ACME to still have a limit on "!source"
|
The only reason for ACME to still have a limit on "!source"
|
||||||
nesting at all is to find infinite recursions. Current limit is
|
nesting at all is to find infinite recursions.
|
||||||
64.
|
The default limit is 64, this can be changed using the
|
||||||
|
"--maxdepth" CLI switch.
|
||||||
|
|
||||||
Value not yet defined.
|
Value not yet defined.
|
||||||
A value could not be worked out. Maybe you mistyped a symbol name.
|
A value could not be worked out. Maybe you mistyped a symbol name.
|
||||||
@ -420,29 +458,49 @@ Section: Bugs in ACME
|
|||||||
The hint messages are of no real interest to the end user, but here
|
The hint messages are of no real interest to the end user, but here
|
||||||
they are for completeness' sake.
|
they are for completeness' sake.
|
||||||
|
|
||||||
|
ArgStackEmpty
|
||||||
|
There was no data for a monadic operator to work on.
|
||||||
|
|
||||||
|
ArgStackNotEmpty
|
||||||
|
The expression parser has finished though there are still
|
||||||
|
arguments left to process.
|
||||||
|
|
||||||
IllegalGroupIndex
|
IllegalGroupIndex
|
||||||
The mnemonic tree contains a group that I didn't add.
|
The mnemonic tree contains a group that I didn't add.
|
||||||
|
|
||||||
IllegalBlockTerminator
|
IllegalBlockTerminator
|
||||||
A RAM block (macro or loop) was terminated incorrectly.
|
A RAM block (macro or loop) was terminated incorrectly.
|
||||||
|
|
||||||
IllegalOperatorHandle
|
IllegalOperatorId
|
||||||
|
IllegalOperatorGroup
|
||||||
The expression parser found an operator that does not exist.
|
The expression parser found an operator that does not exist.
|
||||||
|
|
||||||
IllegalImmediateMode
|
IllegalImmediateMode
|
||||||
The mnemonic tree contains invalid info about the size of immediate
|
The mnemonic tree contains invalid info about the size of immediate
|
||||||
arguments.
|
arguments.
|
||||||
|
|
||||||
OperandStackNotEmpty
|
IllegalSymbolNameLength
|
||||||
The expression parser has finished though there are still operands
|
A sanity check on string lengths failed.
|
||||||
left to parse.
|
|
||||||
|
NotEnoughArgs
|
||||||
|
There was not enough data for a dyadic operator to work on.
|
||||||
|
|
||||||
|
OperatorIsNotDyadic
|
||||||
|
OperatorIsNotMonadic
|
||||||
|
A function was passed the wrong type of operator.
|
||||||
|
|
||||||
OperatorStackNotEmpty
|
OperatorStackNotEmpty
|
||||||
The expression parser has finished though there are still
|
The expression parser has finished though there are still
|
||||||
operators left to parse.
|
operators left to process.
|
||||||
|
|
||||||
|
SecondArgIsNotAnInt
|
||||||
|
A sanity check failed: An argument should have been converted to
|
||||||
|
integer but wasn't.
|
||||||
|
|
||||||
StrangeInputMode
|
StrangeInputMode
|
||||||
The input state machine has reached a state that does not exist.
|
The input state machine has reached a state that does not exist.
|
||||||
|
|
||||||
|
StrangeIndexBracket
|
||||||
|
StrangeListBracket
|
||||||
StrangeParenthesis
|
StrangeParenthesis
|
||||||
The expression parser found a non-existing operator.
|
The expression parser found a non-existing operator.
|
||||||
|
44
src/alu.c
44
src/alu.c
@ -41,6 +41,7 @@
|
|||||||
static const char exception_div_by_zero[] = "Division by zero.";
|
static const char exception_div_by_zero[] = "Division by zero.";
|
||||||
static const char exception_no_value[] = "No value given.";
|
static const char exception_no_value[] = "No value given.";
|
||||||
static const char exception_paren_open[] = "Too many '('.";
|
static const char exception_paren_open[] = "Too many '('.";
|
||||||
|
static const char exception_not_number[] = "Expression did not return a number.";
|
||||||
#define s_or (s_eor + 1) // Yes, I know I'm sick
|
#define s_or (s_eor + 1) // Yes, I know I'm sick
|
||||||
#define s_xor (s_scrxor + 3) // Yes, I know I'm sick
|
#define s_xor (s_scrxor + 3) // Yes, I know I'm sick
|
||||||
static const char s_arcsin[] = "arcsin";
|
static const char s_arcsin[] = "arcsin";
|
||||||
@ -336,7 +337,7 @@ static void is_not_defined(struct symbol *optional_symbol, char optional_prefix_
|
|||||||
}
|
}
|
||||||
DynaBuf_add_string(errormsg_dyna_buf, name);
|
DynaBuf_add_string(errormsg_dyna_buf, name);
|
||||||
if (errormsg_dyna_buf->size < length) {
|
if (errormsg_dyna_buf->size < length) {
|
||||||
Bug_found("Illegal symbol name length", errormsg_dyna_buf->size - length);
|
Bug_found("IllegalSymbolNameLength", errormsg_dyna_buf->size - length);
|
||||||
} else {
|
} else {
|
||||||
errormsg_dyna_buf->size = length;
|
errormsg_dyna_buf->size = length;
|
||||||
}
|
}
|
||||||
@ -465,7 +466,7 @@ static void parse_binary_literal(void) // Now GotByte = "%" or "b"
|
|||||||
break; // found illegal character
|
break; // found illegal character
|
||||||
}
|
}
|
||||||
if (!digits)
|
if (!digits)
|
||||||
Throw_warning("Binary literal without any digits"); // FIXME - make into error!
|
Throw_warning("Binary literal without any digits."); // FIXME - make into error!
|
||||||
// set force bits
|
// set force bits
|
||||||
if (config.honor_leading_zeroes) {
|
if (config.honor_leading_zeroes) {
|
||||||
if (digits > 8) {
|
if (digits > 8) {
|
||||||
@ -512,7 +513,7 @@ static void parse_hex_literal(void) // Now GotByte = "$" or "x"
|
|||||||
break; // found illegal character
|
break; // found illegal character
|
||||||
}
|
}
|
||||||
if (!digits)
|
if (!digits)
|
||||||
Throw_warning("Hex literal without any digits"); // FIXME - make into error!
|
Throw_warning("Hex literal without any digits."); // FIXME - make into error!
|
||||||
// set force bits
|
// set force bits
|
||||||
if (config.honor_leading_zeroes) {
|
if (config.honor_leading_zeroes) {
|
||||||
if (digits > 2) {
|
if (digits > 2) {
|
||||||
@ -609,7 +610,7 @@ static void parse_octal_literal(void) // Now GotByte = "&"
|
|||||||
GetByte();
|
GetByte();
|
||||||
}
|
}
|
||||||
if (!digits)
|
if (!digits)
|
||||||
Throw_warning("Octal literal without any digits"); // FIXME - make into error!
|
Throw_warning("Octal literal without any digits."); // FIXME - make into error!
|
||||||
// set force bits
|
// set force bits
|
||||||
if (config.honor_leading_zeroes) {
|
if (config.honor_leading_zeroes) {
|
||||||
if (digits > 3) {
|
if (digits > 3) {
|
||||||
@ -1027,13 +1028,13 @@ static void unsupported_operation(struct object *optional, struct op *op, struct
|
|||||||
{
|
{
|
||||||
if (optional) {
|
if (optional) {
|
||||||
if (op->group != OPGROUP_DYADIC)
|
if (op->group != OPGROUP_DYADIC)
|
||||||
Bug_found("OperatorIsNotDyadic", op->id); // FIXME - add to docs
|
Bug_found("OperatorIsNotDyadic", op->id);
|
||||||
} else {
|
} else {
|
||||||
if (op->group != OPGROUP_MONADIC)
|
if (op->group != OPGROUP_MONADIC)
|
||||||
Bug_found("OperatorIsNotMonadic", op->id); // FIXME - add to docs
|
Bug_found("OperatorIsNotMonadic", op->id);
|
||||||
}
|
}
|
||||||
DYNABUF_CLEAR(errormsg_dyna_buf);
|
DYNABUF_CLEAR(errormsg_dyna_buf);
|
||||||
DynaBuf_add_string(errormsg_dyna_buf, "Operation not supported: Cannot apply \""); // FIXME - add to docs
|
DynaBuf_add_string(errormsg_dyna_buf, "Operation not supported: Cannot apply \"");
|
||||||
DynaBuf_add_string(errormsg_dyna_buf, op->text_version);
|
DynaBuf_add_string(errormsg_dyna_buf, op->text_version);
|
||||||
DynaBuf_add_string(errormsg_dyna_buf, "\" to \"");
|
DynaBuf_add_string(errormsg_dyna_buf, "\" to \"");
|
||||||
if (optional) {
|
if (optional) {
|
||||||
@ -1328,7 +1329,7 @@ static void int_handle_dyadic_operator(struct object *self, struct op *op, struc
|
|||||||
// maybe put this into an extra "int_dyadic_int" function?
|
// maybe put this into an extra "int_dyadic_int" function?
|
||||||
// sanity check, now "other" must be an int
|
// sanity check, now "other" must be an int
|
||||||
if (other->type != &type_int)
|
if (other->type != &type_int)
|
||||||
Bug_found("SecondArgIsNotAnInt", op->id); // FIXME - rename? then add to docs!
|
Bug_found("SecondArgIsNotAnInt", op->id);
|
||||||
|
|
||||||
// part 2: now we got rid of non-ints, perform actual operation:
|
// part 2: now we got rid of non-ints, perform actual operation:
|
||||||
switch (op->id) {
|
switch (op->id) {
|
||||||
@ -1582,7 +1583,7 @@ static int get_valid_index(int *target, int length, struct object *self, struct
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (!(other->u.number.flags & NUMBER_IS_DEFINED)) {
|
if (!(other->u.number.flags & NUMBER_IS_DEFINED)) {
|
||||||
Throw_error("Index is undefined."); // FIXME - add to docs
|
Throw_error("Index is undefined.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
index = other->u.number.val.intval;
|
index = other->u.number.val.intval;
|
||||||
@ -1821,11 +1822,10 @@ static boolean handle_special_operator(struct expression *expression, enum op_id
|
|||||||
// unmatched parenthesis, as in "lda ($80,x)"
|
// unmatched parenthesis, as in "lda ($80,x)"
|
||||||
++(expression->open_parentheses); // count
|
++(expression->open_parentheses); // count
|
||||||
return TRUE; // caller can remove "OPID_LEFT_PARENTHESIS" operator from stack
|
return TRUE; // caller can remove "OPID_LEFT_PARENTHESIS" operator from stack
|
||||||
// Throw_error("Too many ')'."); // FIXME - remove from docs!
|
|
||||||
|
|
||||||
case OPID_START_LIST:
|
case OPID_START_LIST:
|
||||||
if (current != OPID_END_EXPRESSION)
|
if (current != OPID_END_EXPRESSION)
|
||||||
Bug_found("StrangeListBracket", current); // FIXME - add to docs!
|
Bug_found("StrangeListBracket", current);
|
||||||
if (GotByte == ',') {
|
if (GotByte == ',') {
|
||||||
GetByte(); // eat ','
|
GetByte(); // eat ','
|
||||||
op_stack[op_sp - 1] = &ops_list_append; // change "end of expression" to "append"
|
op_stack[op_sp - 1] = &ops_list_append; // change "end of expression" to "append"
|
||||||
@ -1838,25 +1838,25 @@ static boolean handle_special_operator(struct expression *expression, enum op_id
|
|||||||
alu_state = STATE_EXPECT_DYADIC_OP;
|
alu_state = STATE_EXPECT_DYADIC_OP;
|
||||||
return FALSE; // we fixed the stack ourselves, so caller shouldn't touch it
|
return FALSE; // we fixed the stack ourselves, so caller shouldn't touch it
|
||||||
}
|
}
|
||||||
Throw_error("Unterminated list"); // FIXME - add to docs!
|
Throw_error("Unterminated list.");
|
||||||
alu_state = STATE_ERROR;
|
alu_state = STATE_ERROR;
|
||||||
return TRUE; // caller can remove LISTBUILDER operator from stack
|
return TRUE; // caller can remove LISTBUILDER operator from stack
|
||||||
|
|
||||||
case OPID_START_INDEX:
|
case OPID_START_INDEX:
|
||||||
if (current != OPID_END_EXPRESSION)
|
if (current != OPID_END_EXPRESSION)
|
||||||
Bug_found("StrangeIndexBracket", current); // FIXME - add to docs!
|
Bug_found("StrangeIndexBracket", current);
|
||||||
if (GotByte == ']') {
|
if (GotByte == ']') {
|
||||||
GetByte(); // eat ']'
|
GetByte(); // eat ']'
|
||||||
op_sp -= 2; // remove both OPENINDEX and END_EXPRESSION
|
op_sp -= 2; // remove both OPENINDEX and END_EXPRESSION
|
||||||
alu_state = STATE_EXPECT_DYADIC_OP;
|
alu_state = STATE_EXPECT_DYADIC_OP;
|
||||||
return FALSE; // we fixed the stack ourselves, so caller shouldn't touch it
|
return FALSE; // we fixed the stack ourselves, so caller shouldn't touch it
|
||||||
}
|
}
|
||||||
Throw_error("Unterminated index spec"); // FIXME - add to docs!
|
Throw_error("Unterminated index spec.");
|
||||||
alu_state = STATE_ERROR;
|
alu_state = STATE_ERROR;
|
||||||
return TRUE; // caller can remove START_INDEX operator from stack
|
return TRUE; // caller can remove START_INDEX operator from stack
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Bug_found("IllegalOperatorIdS", previous);
|
Bug_found("IllegalOperatorId", previous);
|
||||||
}
|
}
|
||||||
// this is unreachable
|
// this is unreachable
|
||||||
return FALSE; // stack is done, so caller shouldn't touch it
|
return FALSE; // stack is done, so caller shouldn't touch it
|
||||||
@ -1903,14 +1903,14 @@ static void try_to_reduce_stacks(struct expression *expression)
|
|||||||
switch (previous_op->group) {
|
switch (previous_op->group) {
|
||||||
case OPGROUP_MONADIC: // monadic operators
|
case OPGROUP_MONADIC: // monadic operators
|
||||||
if (arg_sp < 1)
|
if (arg_sp < 1)
|
||||||
Bug_found("ArgStackEmpty", arg_sp); // FIXME - add to docs!
|
Bug_found("ArgStackEmpty", arg_sp);
|
||||||
ARG_NOW.type->handle_monadic_operator(&ARG_NOW, previous_op);
|
ARG_NOW.type->handle_monadic_operator(&ARG_NOW, previous_op);
|
||||||
// operation was something other than parentheses
|
// operation was something other than parentheses
|
||||||
expression->is_parenthesized = FALSE;
|
expression->is_parenthesized = FALSE;
|
||||||
break;
|
break;
|
||||||
case OPGROUP_DYADIC: // dyadic operators
|
case OPGROUP_DYADIC: // dyadic operators
|
||||||
if (arg_sp < 2)
|
if (arg_sp < 2)
|
||||||
Bug_found("NotEnoughArgs", arg_sp); // FIXME - add to docs!
|
Bug_found("NotEnoughArgs", arg_sp);
|
||||||
ARG_PREV.type->handle_dyadic_operator(&ARG_PREV, previous_op, &ARG_NOW);
|
ARG_PREV.type->handle_dyadic_operator(&ARG_PREV, previous_op, &ARG_NOW);
|
||||||
// decrement argument stack pointer because dyadic operator merged two arguments into one
|
// decrement argument stack pointer because dyadic operator merged two arguments into one
|
||||||
--arg_sp;
|
--arg_sp;
|
||||||
@ -1924,7 +1924,7 @@ static void try_to_reduce_stacks(struct expression *expression)
|
|||||||
// both monadics and dyadics clear "is_parenthesized", but here we don't touch it!
|
// both monadics and dyadics clear "is_parenthesized", but here we don't touch it!
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Bug_found("IllegalOperatorGroup", previous_op->group); // FIXME - add to docs!
|
Bug_found("IllegalOperatorGroup", previous_op->group);
|
||||||
}
|
}
|
||||||
// shared endings for "we did the operation indicated by previous operator":
|
// shared endings for "we did the operation indicated by previous operator":
|
||||||
// fix stack:
|
// fix stack:
|
||||||
@ -1978,7 +1978,7 @@ static int parse_expression(struct expression *expression)
|
|||||||
if (alu_state == STATE_END) {
|
if (alu_state == STATE_END) {
|
||||||
// check for bugs
|
// check for bugs
|
||||||
if (arg_sp != 1)
|
if (arg_sp != 1)
|
||||||
Bug_found("OperandStackNotEmpty", arg_sp);
|
Bug_found("ArgStackNotEmpty", arg_sp);
|
||||||
if (op_sp != 1)
|
if (op_sp != 1)
|
||||||
Bug_found("OperatorStackNotEmpty", op_sp);
|
Bug_found("OperatorStackNotEmpty", op_sp);
|
||||||
// copy result
|
// copy result
|
||||||
@ -2039,7 +2039,7 @@ void ALU_any_int(intval_t *target) // ACCEPT_UNDEFINED
|
|||||||
*target = expression.result.u.number.val.fpval;
|
*target = expression.result.u.number.val.fpval;
|
||||||
else {
|
else {
|
||||||
*target = 0;
|
*target = 0;
|
||||||
Throw_error("Expression did not return a number."); // TODO - add to docs!
|
Throw_error(exception_not_number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2069,7 +2069,7 @@ void ALU_defined_int(struct number *intresult) // no ACCEPT constants?
|
|||||||
} else if (expression.result.type == &type_float) {
|
} else if (expression.result.type == &type_float) {
|
||||||
float_to_int(&expression.result);
|
float_to_int(&expression.result);
|
||||||
} else {
|
} else {
|
||||||
Throw_serious_error("Expression did not return a number.");
|
Throw_serious_error(exception_not_number);
|
||||||
}
|
}
|
||||||
if (!(expression.result.u.number.flags & NUMBER_IS_DEFINED))
|
if (!(expression.result.u.number.flags & NUMBER_IS_DEFINED))
|
||||||
Throw_serious_error(exception_value_not_defined);
|
Throw_serious_error(exception_value_not_defined);
|
||||||
@ -2092,7 +2092,7 @@ void ALU_addrmode_int(struct expression *expression, int paren) // ACCEPT_UNDEFI
|
|||||||
if (expression->result.type == &type_float)
|
if (expression->result.type == &type_float)
|
||||||
float_to_int(&(expression->result));
|
float_to_int(&(expression->result));
|
||||||
if (expression->result.type != &type_int)
|
if (expression->result.type != &type_int)
|
||||||
Throw_error("Expression did not return a number.");
|
Throw_error(exception_not_number);
|
||||||
if (expression->open_parentheses > paren) {
|
if (expression->open_parentheses > paren) {
|
||||||
expression->open_parentheses = 0;
|
expression->open_parentheses = 0;
|
||||||
Throw_error(exception_paren_open);
|
Throw_error(exception_paren_open);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user