mirror of
https://github.com/ksherlock/mpw.git
synced 2024-11-28 23:49:26 +00:00
clean up trap loader
This commit is contained in:
parent
9acce3ae03
commit
ece1984c5c
127
bin/loadtrap.rl
127
bin/loadtrap.rl
@ -3,50 +3,76 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "debugger.h"
|
|
||||||
|
|
||||||
%%{
|
%%{
|
||||||
|
|
||||||
machine traplist;
|
machine lexer;
|
||||||
|
|
||||||
action error {
|
action error {
|
||||||
fprintf(stderr, "Invalid line: %d %.*s", line, (int)length, cp);
|
fprintf(stderr, "Invalid line: %d %.*s", line, (int)length, cp);
|
||||||
fprintf(stderr, "%s - %x\n", name.c_str(), trap);
|
fprintf(stderr, "%s - %x\n", name.c_str(), trap);
|
||||||
}
|
}
|
||||||
|
|
||||||
main :=
|
action addx {
|
||||||
[ \t]*
|
trap = (trap << 4) + digittoint(fc);
|
||||||
|
}
|
||||||
|
|
||||||
|
action emplace {
|
||||||
|
|
||||||
|
auto iter = map.find(name);
|
||||||
|
if (iter != map.end() && iter->second != trap)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Warning: redefining %s ($%04x -> $%04x)\n",
|
||||||
|
name.c_str(),
|
||||||
|
iter->second,
|
||||||
|
trap
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
map[std::move(name)] = trap;
|
||||||
|
}
|
||||||
|
|
||||||
|
ws = [ \t];
|
||||||
|
|
||||||
|
|
||||||
|
value =
|
||||||
|
'0x' >{trap = 0; } xdigit+ @addx
|
||||||
|
|
|
||||||
|
'$' >{trap = 0; } xdigit+ @addx
|
||||||
|
# todo -- add identifiers?
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
line :=
|
||||||
[_A-Za-z][_A-Za-z0-9]* @{
|
[_A-Za-z][_A-Za-z0-9]* @{
|
||||||
name.push_back(fc);
|
name.push_back(fc);
|
||||||
}
|
}
|
||||||
[ \t]*
|
|
||||||
'='
|
|
||||||
[ \t]*
|
|
||||||
('0x' | '$')
|
|
||||||
[0-9A-Fa-f]+ @{
|
|
||||||
trap = (trap << 4) + digittoint(fc);
|
|
||||||
}
|
|
||||||
[ \t\r\n]*
|
|
||||||
|
|
||||||
%eof {
|
ws*
|
||||||
// final state
|
'='
|
||||||
map.emplace(name, trap);
|
ws*
|
||||||
}
|
value
|
||||||
@eof(error)
|
'\n' @emplace
|
||||||
$err(error)
|
;
|
||||||
|
|
||||||
;
|
comment := any* ${ fbreak; };
|
||||||
|
|
||||||
|
main := |*
|
||||||
|
ws; # leading space
|
||||||
|
'\n'; # blank line.
|
||||||
|
'#' => { fgoto comment; };
|
||||||
|
[A-Za-z_] => { fhold; fgoto line; };
|
||||||
|
*|;
|
||||||
|
|
||||||
}%%
|
}%%
|
||||||
|
|
||||||
namespace Debug {
|
namespace Debug {
|
||||||
std::unordered_map<std::string, uint16_t> LoadTrapFile(const std::string &path)
|
std::unordered_map<std::string, uint32_t> LoadTrapFile(const std::string &path)
|
||||||
{
|
{
|
||||||
%% write data nofinal;
|
%% write data;
|
||||||
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
std::unordered_map<std::string, uint16_t> map;
|
std::unordered_map<std::string, uint32_t> map;
|
||||||
|
|
||||||
fp = fopen(path.c_str(), "r");
|
fp = fopen(path.c_str(), "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
@ -55,6 +81,9 @@ std::unordered_map<std::string, uint16_t> LoadTrapFile(const std::string &path)
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo -- consider using the debugger parser? That would allow
|
||||||
|
// full mathematical expressions.
|
||||||
|
|
||||||
int line = 0;
|
int line = 0;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
@ -65,25 +94,42 @@ std::unordered_map<std::string, uint16_t> LoadTrapFile(const std::string &path)
|
|||||||
if (!cp) break;
|
if (!cp) break;
|
||||||
++line;
|
++line;
|
||||||
|
|
||||||
|
#if 0
|
||||||
while (isspace(*cp) && length)
|
while (isspace(*cp) && length)
|
||||||
{
|
{
|
||||||
++cp;
|
++cp;
|
||||||
length--;
|
length--;
|
||||||
}
|
}
|
||||||
if (!length) continue;
|
if (!length) continue;
|
||||||
if (*cp == '#') continue;
|
#endif
|
||||||
|
|
||||||
|
while (length && isspace(cp[length - 1]))
|
||||||
|
length--;
|
||||||
|
if (!length) continue;
|
||||||
|
|
||||||
|
std::string buffer(cp, cp + length);
|
||||||
|
buffer.push_back('\n');
|
||||||
|
|
||||||
|
const char *p = buffer.c_str();
|
||||||
|
const char *pe = p + buffer.length();
|
||||||
|
const char *eof = pe;
|
||||||
|
const char *ts;
|
||||||
|
const char *te;
|
||||||
|
|
||||||
char *p = cp;
|
|
||||||
char *pe = p + length;
|
|
||||||
char *eof = p + length;
|
|
||||||
int cs;
|
int cs;
|
||||||
|
int act;
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
uint16_t trap = 0;
|
uint32_t trap = 0;
|
||||||
|
|
||||||
%% write init;
|
%% write init;
|
||||||
/* ... */
|
/* ... */
|
||||||
%% write exec;
|
%% write exec;
|
||||||
|
|
||||||
|
if (cs == lexer_error)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Bad line: %.*s\n", (int)length, cp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -91,3 +137,26 @@ std::unordered_map<std::string, uint16_t> LoadTrapFile(const std::string &path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < argc; ++i)
|
||||||
|
{
|
||||||
|
std::string f(argv[i]);
|
||||||
|
|
||||||
|
auto map = Debug::LoadTrapFile(f);
|
||||||
|
|
||||||
|
for(const auto kv : map)
|
||||||
|
{
|
||||||
|
printf("%s -> %04x\n", kv.first.c_str(), kv.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user