Я довольно много закончил кодирование SIC-ассемблера для моего класса системного программирования, но я в тупике на токенизирующей части.Токенизация источника ассемблера SIC
Например, возьмем эту строку исходного кода:
формат (свободный формат) составляет: {ЗАГОЛОВОК} OPCODE {ОПЕРАНДА {Х}} {К.П}
Завитки указывают, что поле не является обязательным.
Кроме того, каждое поле должно быть разделено хотя бы одним пробелом или табуляцией.
ENDFIL LDA EOF COMMENT GOES HERE
Код, приведенный выше, немного проще организовать, но следующий фрагмент дает мне трудности.
RSUB COMMENT GOES HERE
Мой код будет читать в первом слове комментария, как если бы это был ОПЕРAND.
Вот мой код:
//tokenize line
if(currentLine[0] != ' ' && currentLine[0] != '\t')
{
stringstream stream(currentLine);
stream >> LABEL;
stream >> OPCODE;
stream >> OPERAND;
stream.str("");
if(LABEL.length() > 6 || isdigit(LABEL[0]) || !alphaNum(LABEL))
{
errors[1] = 1;
}
else if(LABEL.length() == currentLine.length())
{
justLabel = true;
errors[6] = 1;
return;
}
}
else
{
stringstream stream(currentLine);
stream >> OPCODE;
stream >> OPERAND;
stream.str("");
}
Мой профессор требует, чтобы ассемблер быть протестированы с двумя версиями исходного кода - один с ошибками и без.
RSUB OPCODE не зависит от OPERAND, поэтому я понимаю, что все после OPCODE RSUB можно рассматривать как комментарий, но если ошибочный исходный код содержит значение в поле OPERAND или если OPCODE, который зависит от OPERAND не имеет значения OPERAND, как я могу это компенсировать? Мне нужно отметить эти ошибки и распечатать ошибочное значение OPERAND (или его отсутствие).
Мой вопрос: Как предотвратить комментарий части кода, считающегося OPERAND?
Это вещь, нет разделителей, что я мог бы использовать, чтобы отличить поле комментария от поля операндов. В отношении пробелов мой профессор заявил в своем спецификационном листе: «Исходный код находится в свободном формате, и единственным правилом является то, что каждое поле должно быть разделено хотя бы пробелом или вкладкой». Теперь я уверен, как с этим справиться. –
Может быть, вы должны знать, что RSUB не имеет оператора, и поэтому что-нибудь после RSUB должно быть комментарием? – ChrisW
Возможно, вы правы. Может быть, я просто слишком усложняю ситуацию. Большое спасибо! –