mirror of
https://github.com/marketideas/qasm.git
synced 2025-01-29 17:30:31 +00:00
parser regex complete
This commit is contained in:
parent
dd7dcb4082
commit
b391c9b729
156
asm.cpp
156
asm.cpp
@ -313,14 +313,14 @@ void CLASS::clear()
|
||||
|
||||
std::string operEx[] =
|
||||
{
|
||||
"^(#?)([<>\\^|]?)([\"\'])(.*)(\\3)([\\S]*)", // catches the normal delims
|
||||
"^([!$%&()*+,\\-.\\/])(.\\S*)[\\1](\\S*)",
|
||||
"^(\\s*)(\\S*)",
|
||||
"^(\\S*)(#?)([<>\\^|]?)([\"\'])(.*)(\\4)([\\S]*)", // catches the normal delims
|
||||
"^(\\s*)([!-~])([!-~]*?)([^;]*)\\2(\\S*)", // catches the unusual delims
|
||||
"^(\\s*)(\\S+)", // captures everything else
|
||||
""
|
||||
};
|
||||
|
||||
std::string commentEx = "^(\\s*)((;|\\/{2}))+(.*)";
|
||||
|
||||
// ^(\s*)(;?)(([\/]{2})?)(.*)
|
||||
void CLASS::set(std::string line)
|
||||
{
|
||||
int state = 0;
|
||||
@ -336,13 +336,21 @@ void CLASS::set(std::string line)
|
||||
|
||||
isascii = false;
|
||||
delim = 0;
|
||||
//printf("line: |%s|\n", line.c_str());
|
||||
while (i < l)
|
||||
{
|
||||
c = tline[i++];
|
||||
//printf("state: %d\n",state);
|
||||
switch (state)
|
||||
{
|
||||
case 7:
|
||||
if (c >= ' ')
|
||||
{
|
||||
comment += c;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = l;
|
||||
}
|
||||
break;
|
||||
case 0: // start of line state
|
||||
if ((c == ';') || (c == '*') || (c == '/'))
|
||||
{
|
||||
@ -387,32 +395,63 @@ void CLASS::set(std::string line)
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
if (c > ' ')
|
||||
{
|
||||
if (c > ' ')
|
||||
opcode += c;
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
state = 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // read whitespace between opcode and operand
|
||||
{
|
||||
std::vector<std::string> strs;
|
||||
std::string s;
|
||||
|
||||
Poco::RegularExpression comEx(commentEx, 0, true);
|
||||
restofline = Poco::trim(tline.substr(i, tline.length())) + " ";
|
||||
//printf("ROL: |%s|\n",restofline.c_str());
|
||||
|
||||
strs.clear();
|
||||
x = 0;
|
||||
try
|
||||
{
|
||||
x = comEx.split(restofline, strs, 0);
|
||||
}
|
||||
catch (Poco::Exception &e)
|
||||
{
|
||||
x = 0;
|
||||
if (isDebug() > 3)
|
||||
{
|
||||
opcode += c;
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
state = 4;
|
||||
cout << e.displayText() << endl;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // read whitespace between opcode and operand
|
||||
if (x > 0)
|
||||
{
|
||||
std::vector<std::string> strs;
|
||||
std::string s;
|
||||
|
||||
Poco::RegularExpression comEx(commentEx, 0, true);
|
||||
restofline = Poco::trim(tline.substr(i, tline.length()))+" ";
|
||||
//printf("ROL: |%s|\n",restofline.c_str());
|
||||
// if the comment detector above is true, then the rest of line is comment;
|
||||
operand = "";
|
||||
comment = strs[0];
|
||||
//printf("comment=%s\n", comment.c_str());
|
||||
i = l;
|
||||
break;
|
||||
}
|
||||
|
||||
int ct = 0;
|
||||
int x = 0;
|
||||
bool match = false;
|
||||
s = operEx[ct];
|
||||
while (s != "")
|
||||
{
|
||||
RegularExpression regex(s, 0, true);
|
||||
strs.clear();
|
||||
x = 0;
|
||||
try
|
||||
{
|
||||
x = comEx.split(restofline, strs, 0);
|
||||
x = regex.split(restofline, strs, 0);
|
||||
}
|
||||
catch (Poco::Exception &e)
|
||||
{
|
||||
@ -424,63 +463,34 @@ void CLASS::set(std::string line)
|
||||
}
|
||||
if (x > 0)
|
||||
{
|
||||
// if the comment detector above is true, then the rest of line is comment;
|
||||
operand = "";
|
||||
comment = strs[0];
|
||||
//printf("comment=%s\n",comment.c_str());
|
||||
i = l;
|
||||
//printf("%d regex %d match |%s|\n", ct, x, restofline.c_str());
|
||||
operand = strs[0];
|
||||
//printf("which=%d operand=|%s|\n",ct,operand.c_str());
|
||||
i = operand.length();
|
||||
restofline = restofline.substr(i, restofline.length());
|
||||
comment = Poco::trim(restofline);
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
|
||||
int ct = 0;
|
||||
int x = 0;
|
||||
bool match = false;
|
||||
ct++;
|
||||
s = operEx[ct];
|
||||
while (s != "")
|
||||
{
|
||||
RegularExpression regex(s, 0, true);
|
||||
strs.clear();
|
||||
x = 0;
|
||||
try
|
||||
{
|
||||
x = regex.split(restofline, strs, 0);
|
||||
}
|
||||
catch (Poco::Exception &e)
|
||||
{
|
||||
x = 0;
|
||||
if (isDebug() > 3)
|
||||
{
|
||||
cout << e.displayText() << endl;
|
||||
}
|
||||
}
|
||||
if (x > 0)
|
||||
{
|
||||
//printf("%d regex %d match |%s|\n", ct, x, restofline.c_str());
|
||||
operand = strs[0];
|
||||
//printf("which=%d operand=|%s|\n",ct,operand.c_str());
|
||||
i = operand.length();
|
||||
restofline=restofline.substr(i,restofline.length());
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
ct++;
|
||||
s = operEx[ct];
|
||||
}
|
||||
i=l;
|
||||
if (!match)
|
||||
{
|
||||
opcode="BAD"; // let assembler figure out this is a bad opcode
|
||||
// SGQ maybe error here
|
||||
//printf("---No Match %s\n", restofline.c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
i = l;
|
||||
if (!match)
|
||||
{
|
||||
opcode = ":::"; // let assembler figure out this is a bad opcode
|
||||
// SGQ maybe error here
|
||||
//printf("---No Match %s\n", restofline.c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
printlable = lable;
|
||||
x = lable.length();
|
||||
if (x > 1)
|
||||
{
|
||||
// SGQ M32 syntax
|
||||
#if 0
|
||||
while ((x > 1) && (lable[x - 1] == ':'))
|
||||
{
|
||||
@ -676,6 +686,7 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
linect = 0;
|
||||
done = false;
|
||||
|
||||
p = Poco::trim(p);
|
||||
currentdir = Poco::Path::current();
|
||||
|
||||
if (filecount == 0)
|
||||
@ -746,10 +757,14 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
}
|
||||
if ((fn.isDirectory()) || (!fn.canRead()))
|
||||
{
|
||||
//LOG_DEBUG << "File is a directory: " << p1 << endl;
|
||||
LOG_DEBUG << "File is a directory: " << p1 << endl;
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("file does not exist |%s|\n", p1.c_str());
|
||||
}
|
||||
|
||||
newfilename = p1;
|
||||
if (!valid)
|
||||
@ -2014,6 +2029,7 @@ int CLASS::doline(int lineno, std::string line)
|
||||
{
|
||||
std::string fn;
|
||||
x = processfile(l.operand, fn);
|
||||
//printf("processfile : %d\n",x);
|
||||
if (x < 0)
|
||||
{
|
||||
switch (x)
|
||||
|
1
config.h
1
config.h
@ -14,6 +14,7 @@
|
||||
//#define USE_JSON
|
||||
//#define USE_XML
|
||||
|
||||
#define NO_TTY_SETUP
|
||||
// help text
|
||||
#define HELP_USAGE "<options> <list of files>"
|
||||
#define HELP_PURPOSE "\nMerlin 16+ Compatible 65816 Development Tool"
|
||||
|
@ -27,6 +27,8 @@ for S in $SRC ; do
|
||||
|
||||
BASE=${S/.S/}
|
||||
BASE=${BASE/.s/}
|
||||
#./qasm -o 0/$OUTDIR/$S1 ./testdata/$S
|
||||
|
||||
./qasm -o 0/$OUTDIR/$S1 ./testdata/$S >> $TMPFILE
|
||||
|
||||
R=?$
|
||||
|
2
testdata/2019-local-variables.S
vendored
2
testdata/2019-local-variables.S
vendored
@ -155,5 +155,5 @@ LOCAL1 lda #$2c ;EDIT: format as ASCII
|
||||
beq LOCAL1
|
||||
LOCAL2 lda $2c ;EDIT: format as ASCII
|
||||
ldx $5678 ;put empty variable table here
|
||||
beq LOCAL2
|
||||
;beq LOCAL2
|
||||
rts
|
||||
|
8
todo.txt
8
todo.txt
@ -1,9 +1,11 @@
|
||||
(0) 2019-11-17 - BRK does not detect a lable that can't be evaluated
|
||||
(0) 2019-11-17 - ASCII parsing in both eval and for ASC type commands
|
||||
(0) 2019-11-17 - IF processing for character compare mode
|
||||
(0) 2019-11-17 -
|
||||
(0) 2019-11-17 -
|
||||
(0) 2019-11-17 -
|
||||
(0) 2019-11-17 - Note (syntax) Merlin doesn't allow 'A' implied addressing
|
||||
(0) 2019-11-17 - Note (syntax): Merlin doesn't allow local labels without a previous global
|
||||
(0) 2019-11-17 - Note (syntax): Merlin doesn't allow local colons after label which is ignored
|
||||
(0) 2019-11-17 - Note (syntax): Merlin doesn't allow for 'rep/sep/xce' tracking
|
||||
(0) 2019-11-17 - Bug (evaluation routine puts ascii bytes in reverse order (#"AB")
|
||||
(0) 2019-11-17 -
|
||||
(0) 2019-11-17 -
|
||||
(0) 2019-11-17 -
|
||||
|
Loading…
x
Reference in New Issue
Block a user