2016-09-07 04:50:47 +01:00
|
|
|
#include "asm.h"
|
|
|
|
|
|
|
|
Asm::Asm()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Asm::strip_comment(QString *line) {
|
|
|
|
bool in_string = false;
|
|
|
|
for (int i = 0; i < line->length(); i++) {
|
|
|
|
if (line->at(i) == '"') {
|
|
|
|
in_string = !in_string;
|
|
|
|
} else if (line->at(i) == '@') {
|
|
|
|
if (!in_string) {
|
|
|
|
line->truncate(i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<QStringList>* Asm::parse(QString text) {
|
|
|
|
QList<QStringList> *parsed = new QList<QStringList>;
|
|
|
|
QStringList lines = text.split('\n');
|
|
|
|
for (QString line : lines) {
|
|
|
|
QString label;
|
|
|
|
//QString macro;
|
|
|
|
//QStringList *params;
|
|
|
|
strip_comment(&line);
|
2018-02-17 21:00:15 +00:00
|
|
|
if (line.trimmed().isEmpty()) {
|
2016-09-07 04:50:47 +01:00
|
|
|
} else if (line.contains(':')) {
|
|
|
|
label = line.left(line.indexOf(':'));
|
|
|
|
QStringList *list = new QStringList;
|
|
|
|
list->append(".label"); // This is not a real keyword. It's used only to make the output more regular.
|
|
|
|
list->append(label);
|
|
|
|
parsed->append(*list);
|
|
|
|
// There should not be anything else on the line.
|
|
|
|
// gas will raise a syntax error if there is.
|
|
|
|
} else {
|
|
|
|
line = line.trimmed();
|
|
|
|
//parsed->append(line.split(QRegExp("\\s*,\\s*")));
|
|
|
|
QString macro;
|
|
|
|
QStringList params;
|
|
|
|
int index = line.indexOf(QRegExp("\\s+"));
|
|
|
|
macro = line.left(index);
|
|
|
|
params = line.right(line.length() - index).trimmed().split(QRegExp("\\s*,\\s*"));
|
|
|
|
params.prepend(macro);
|
|
|
|
parsed->append(params);
|
|
|
|
}
|
|
|
|
//if (macro != NULL) {
|
|
|
|
// if (macros->contains(macro)) {
|
|
|
|
// void* function = macros->value(macro);
|
|
|
|
// if (function != NULL) {
|
|
|
|
// std::function function(params);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
return parsed;
|
|
|
|
}
|