mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
debug/express.cpp: Fix parsing for preincrement & predecrement operators; make debugging function print_tokens usable again
This commit is contained in:
parent
67cecba6b3
commit
aaec472649
@ -41,7 +41,9 @@
|
||||
DEBUGGING
|
||||
***************************************************************************/
|
||||
|
||||
#define DEBUG_TOKENS 0
|
||||
#define LOG_OUTPUT_FUNC osd_printf_info
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
|
||||
|
||||
@ -1119,89 +1121,72 @@ void parsed_expression::copy(const parsed_expression &src)
|
||||
// human readable token representation
|
||||
//-------------------------------------------------
|
||||
|
||||
void parsed_expression::print_tokens(FILE *out)
|
||||
void parsed_expression::print_tokens()
|
||||
{
|
||||
#if DEBUG_TOKENS
|
||||
osd_printf_debug("----\n");
|
||||
for (parse_token *token = m_tokens.first(); token != nullptr; token = token->next())
|
||||
LOG("----\n");
|
||||
for (parse_token &token : m_tokenlist)
|
||||
{
|
||||
switch (token->type)
|
||||
if (token.is_number())
|
||||
LOG("NUMBER: %016X\n", token.value());
|
||||
else if (token.is_string())
|
||||
LOG("STRING: ""%s""\n", token.string());
|
||||
else if (token.is_symbol())
|
||||
LOG("SYMBOL: %s%s%s\n", token.symbol().name(), token.symbol().is_function() ? "()" : "", token.symbol().is_lval() ? " &" : "");
|
||||
else if (token.is_operator())
|
||||
{
|
||||
default:
|
||||
case parse_token::INVALID:
|
||||
fprintf(out, "INVALID\n");
|
||||
break;
|
||||
|
||||
case parse_token::END:
|
||||
fprintf(out, "END\n");
|
||||
break;
|
||||
|
||||
case parse_token::NUMBER:
|
||||
fprintf(out, "NUMBER: %08X%08X\n", (u32)(token->value.i >> 32), u32(token->value.i));
|
||||
break;
|
||||
|
||||
case parse_token::STRING:
|
||||
fprintf(out, "STRING: ""%s""\n", token->string);
|
||||
break;
|
||||
|
||||
case parse_token::SYMBOL:
|
||||
fprintf(out, "SYMBOL: %08X%08X\n", u32(token->value.i >> 32), u32(token->value.i));
|
||||
break;
|
||||
|
||||
case parse_token::OPERATOR:
|
||||
switch (token->value.i)
|
||||
{
|
||||
case TVL_LPAREN: fprintf(out, "(\n"); break;
|
||||
case TVL_RPAREN: fprintf(out, ")\n"); break;
|
||||
case TVL_PLUSPLUS: fprintf(out, "++ (unspecified)\n"); break;
|
||||
case TVL_MINUSMINUS: fprintf(out, "-- (unspecified)\n"); break;
|
||||
case TVL_PREINCREMENT: fprintf(out, "++ (prefix)\n"); break;
|
||||
case TVL_PREDECREMENT: fprintf(out, "-- (prefix)\n"); break;
|
||||
case TVL_POSTINCREMENT: fprintf(out, "++ (postfix)\n"); break;
|
||||
case TVL_POSTDECREMENT: fprintf(out, "-- (postfix)\n"); break;
|
||||
case TVL_COMPLEMENT: fprintf(out, "!\n"); break;
|
||||
case TVL_NOT: fprintf(out, "~\n"); break;
|
||||
case TVL_UPLUS: fprintf(out, "+ (unary)\n"); break;
|
||||
case TVL_UMINUS: fprintf(out, "- (unary)\n"); break;
|
||||
case TVL_MULTIPLY: fprintf(out, "*\n"); break;
|
||||
case TVL_DIVIDE: fprintf(out, "/\n"); break;
|
||||
case TVL_MODULO: fprintf(out, "%%\n"); break;
|
||||
case TVL_ADD: fprintf(out, "+\n"); break;
|
||||
case TVL_SUBTRACT: fprintf(out, "-\n"); break;
|
||||
case TVL_LSHIFT: fprintf(out, "<<\n"); break;
|
||||
case TVL_RSHIFT: fprintf(out, ">>\n"); break;
|
||||
case TVL_LESS: fprintf(out, "<\n"); break;
|
||||
case TVL_LESSOREQUAL: fprintf(out, "<=\n"); break;
|
||||
case TVL_GREATER: fprintf(out, ">\n"); break;
|
||||
case TVL_GREATEROREQUAL:fprintf(out, ">=\n"); break;
|
||||
case TVL_EQUAL: fprintf(out, "==\n"); break;
|
||||
case TVL_NOTEQUAL: fprintf(out, "!=\n"); break;
|
||||
case TVL_BAND: fprintf(out, "&\n"); break;
|
||||
case TVL_BXOR: fprintf(out, "^\n"); break;
|
||||
case TVL_BOR: fprintf(out, "|\n"); break;
|
||||
case TVL_LAND: fprintf(out, "&&\n"); break;
|
||||
case TVL_LOR: fprintf(out, "||\n"); break;
|
||||
case TVL_ASSIGN: fprintf(out, "=\n"); break;
|
||||
case TVL_ASSIGNMULTIPLY:fprintf(out, "*=\n"); break;
|
||||
case TVL_ASSIGNDIVIDE: fprintf(out, "/=\n"); break;
|
||||
case TVL_ASSIGNMODULO: fprintf(out, "%%=\n"); break;
|
||||
case TVL_ASSIGNADD: fprintf(out, "+=\n"); break;
|
||||
case TVL_ASSIGNSUBTRACT:fprintf(out, "-=\n"); break;
|
||||
case TVL_ASSIGNLSHIFT: fprintf(out, "<<=\n"); break;
|
||||
case TVL_ASSIGNRSHIFT: fprintf(out, ">>=\n"); break;
|
||||
case TVL_ASSIGNBAND: fprintf(out, "&=\n"); break;
|
||||
case TVL_ASSIGNBXOR: fprintf(out, "^=\n"); break;
|
||||
case TVL_ASSIGNBOR: fprintf(out, "|=\n"); break;
|
||||
case TVL_COMMA: fprintf(out, ",\n"); break;
|
||||
case TVL_MEMORYAT: fprintf(out, token.memory_size_effect() ? "mem!\n" : "mem@\n");break;
|
||||
case TVL_EXECUTEFUNC: fprintf(out, "execute\n"); break;
|
||||
default: fprintf(out, "INVALID OPERATOR\n"); break;
|
||||
}
|
||||
break;
|
||||
switch (token.optype())
|
||||
{
|
||||
case TVL_LPAREN: LOG("(\n"); break;
|
||||
case TVL_RPAREN: LOG(")\n"); break;
|
||||
case TVL_PLUSPLUS: LOG("++ (unspecified)\n"); break;
|
||||
case TVL_MINUSMINUS: LOG("-- (unspecified)\n"); break;
|
||||
case TVL_PREINCREMENT: LOG("++ (prefix)\n"); break;
|
||||
case TVL_PREDECREMENT: LOG("-- (prefix)\n"); break;
|
||||
case TVL_POSTINCREMENT: LOG("++ (postfix)\n"); break;
|
||||
case TVL_POSTDECREMENT: LOG("-- (postfix)\n"); break;
|
||||
case TVL_COMPLEMENT: LOG("!\n"); break;
|
||||
case TVL_NOT: LOG("~\n"); break;
|
||||
case TVL_UPLUS: LOG("+ (unary)\n"); break;
|
||||
case TVL_UMINUS: LOG("- (unary)\n"); break;
|
||||
case TVL_MULTIPLY: LOG("*\n"); break;
|
||||
case TVL_DIVIDE: LOG("/\n"); break;
|
||||
case TVL_MODULO: LOG("%%\n"); break;
|
||||
case TVL_ADD: LOG("+\n"); break;
|
||||
case TVL_SUBTRACT: LOG("-\n"); break;
|
||||
case TVL_LSHIFT: LOG("<<\n"); break;
|
||||
case TVL_RSHIFT: LOG(">>\n"); break;
|
||||
case TVL_LESS: LOG("<\n"); break;
|
||||
case TVL_LESSOREQUAL: LOG("<=\n"); break;
|
||||
case TVL_GREATER: LOG(">\n"); break;
|
||||
case TVL_GREATEROREQUAL:LOG(">=\n"); break;
|
||||
case TVL_EQUAL: LOG("==\n"); break;
|
||||
case TVL_NOTEQUAL: LOG("!=\n"); break;
|
||||
case TVL_BAND: LOG("&\n"); break;
|
||||
case TVL_BXOR: LOG("^\n"); break;
|
||||
case TVL_BOR: LOG("|\n"); break;
|
||||
case TVL_LAND: LOG("&&\n"); break;
|
||||
case TVL_LOR: LOG("||\n"); break;
|
||||
case TVL_ASSIGN: LOG("=\n"); break;
|
||||
case TVL_ASSIGNMULTIPLY:LOG("*=\n"); break;
|
||||
case TVL_ASSIGNDIVIDE: LOG("/=\n"); break;
|
||||
case TVL_ASSIGNMODULO: LOG("%%=\n"); break;
|
||||
case TVL_ASSIGNADD: LOG("+=\n"); break;
|
||||
case TVL_ASSIGNSUBTRACT:LOG("-=\n"); break;
|
||||
case TVL_ASSIGNLSHIFT: LOG("<<=\n"); break;
|
||||
case TVL_ASSIGNRSHIFT: LOG(">>=\n"); break;
|
||||
case TVL_ASSIGNBAND: LOG("&=\n"); break;
|
||||
case TVL_ASSIGNBXOR: LOG("^=\n"); break;
|
||||
case TVL_ASSIGNBOR: LOG("|=\n"); break;
|
||||
case TVL_COMMA: LOG(",\n"); break;
|
||||
case TVL_MEMORYAT: LOG(token.memory_side_effects() ? "mem!\n" : "mem@\n");break;
|
||||
case TVL_EXECUTEFUNC: LOG("execute\n"); break;
|
||||
default: LOG("INVALID OPERATOR\n"); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG("INVALID\n");
|
||||
}
|
||||
osd_printf_debug("----\n");
|
||||
#endif
|
||||
LOG("----\n");
|
||||
}
|
||||
|
||||
|
||||
@ -1696,9 +1681,8 @@ void parsed_expression::parse_memory_operator(parse_token &token, const char *st
|
||||
// ambiguities based on neighboring tokens
|
||||
//-------------------------------------------------
|
||||
|
||||
void parsed_expression::normalize_operator(parse_token *prevtoken, parse_token &thistoken, const std::list<parse_token> &stack, bool was_rparen)
|
||||
void parsed_expression::normalize_operator(parse_token &thistoken, parse_token *prevtoken, parse_token *nexttoken, const std::list<parse_token> &stack, bool was_rparen)
|
||||
{
|
||||
parse_token *nexttoken = thistoken.next();
|
||||
switch (thistoken.optype())
|
||||
{
|
||||
// Determine if an open paren is part of a function or not
|
||||
@ -1791,7 +1775,7 @@ void parsed_expression::infix_to_postfix()
|
||||
else if (token->is_operator())
|
||||
{
|
||||
// normalize the operator based on neighbors
|
||||
normalize_operator(prev, *token, stack, was_rparen);
|
||||
normalize_operator(*token, prev, next != m_tokenlist.end() ? &*next : nullptr, stack, was_rparen);
|
||||
was_rparen = false;
|
||||
|
||||
// if the token is an opening parenthesis, push it onto the stack.
|
||||
@ -2206,8 +2190,7 @@ u64 parsed_expression::execute_tokens()
|
||||
//-------------------------------------------------
|
||||
|
||||
parsed_expression::parse_token::parse_token(int offset)
|
||||
: m_next(nullptr),
|
||||
m_type(INVALID),
|
||||
: m_type(INVALID),
|
||||
m_offset(offset),
|
||||
m_value(0),
|
||||
m_flags(0),
|
||||
@ -2274,7 +2257,7 @@ void parsed_expression::execute_function(parse_token &token)
|
||||
// if it is a function symbol, break out of the loop
|
||||
if (peek.is_symbol())
|
||||
{
|
||||
symbol = peek.symbol();
|
||||
symbol = &peek.symbol();
|
||||
if (symbol->is_function())
|
||||
{
|
||||
m_token_stack.pop_back();
|
||||
|
@ -283,7 +283,6 @@ private:
|
||||
parse_token(int offset = 0);
|
||||
|
||||
// getters
|
||||
parse_token *next() const { return m_next; }
|
||||
int offset() const { return m_offset; }
|
||||
bool is_number() const { return (m_type == NUMBER); }
|
||||
bool is_string() const { return (m_type == STRING); }
|
||||
@ -294,8 +293,9 @@ private:
|
||||
bool is_lval() const { return ((m_type == SYMBOL && m_symbol->is_lval()) || m_type == MEMORY); }
|
||||
|
||||
u64 value() const { assert(m_type == NUMBER); return m_value; }
|
||||
const char *string() const { assert(m_type == STRING); return m_string; }
|
||||
u32 address() const { assert(m_type == MEMORY); return m_value; }
|
||||
symbol_entry *symbol() const { assert(m_type == SYMBOL); return m_symbol; }
|
||||
symbol_entry &symbol() const { assert(m_type == SYMBOL); return *m_symbol; }
|
||||
|
||||
u8 optype() const { assert(m_type == OPERATOR); return (m_flags & TIN_OPTYPE_MASK) >> TIN_OPTYPE_SHIFT; }
|
||||
u8 precedence() const { assert(m_type == OPERATOR); return (m_flags & TIN_PRECEDENCE_MASK) >> TIN_PRECEDENCE_SHIFT; }
|
||||
@ -329,7 +329,6 @@ private:
|
||||
|
||||
private:
|
||||
// internal state
|
||||
parse_token * m_next; // next token in list
|
||||
token_type m_type; // type of token
|
||||
int m_offset; // offset within the string
|
||||
u64 m_value; // integral value
|
||||
@ -340,7 +339,7 @@ private:
|
||||
|
||||
// internal helpers
|
||||
void copy(const parsed_expression &src);
|
||||
void print_tokens(FILE *out);
|
||||
void print_tokens();
|
||||
|
||||
// parsing helpers
|
||||
void parse_string_into_tokens();
|
||||
@ -349,7 +348,7 @@ private:
|
||||
void parse_quoted_char(parse_token &token, const char *&string);
|
||||
void parse_quoted_string(parse_token &token, const char *&string);
|
||||
void parse_memory_operator(parse_token &token, const char *string, bool disable_se);
|
||||
void normalize_operator(parse_token *prevtoken, parse_token &thistoken, const std::list<parse_token> &stack, bool was_rparen);
|
||||
void normalize_operator(parse_token &thistoken, parse_token *prevtoken, parse_token *nexttoken, const std::list<parse_token> &stack, bool was_rparen);
|
||||
void infix_to_postfix();
|
||||
|
||||
// execution helpers
|
||||
|
Loading…
Reference in New Issue
Block a user