2009-05-26 3 views
3

Я довольно много закончил кодирование 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?

ответ

-1

В языке ассемблера (как и в других языках программирования), что я видел, есть ограничитель, который отмечает комментарий: например, точку с запятой перед комментарием:

ENDFIL LDA EOF ;COMMENT GOES HERE 
RSUB ;ANOTHER COMMENT GOES HERE 

В вашем синтаксисе однако, может вы указываете, является ли что-то комментарием по количеству пробелов, которое предшествует ему на линии, например из-за того, что между кодом операции и комментарием есть два (не только один) случайных события?

{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT} 
+0

Это вещь, нет разделителей, что я мог бы использовать, чтобы отличить поле комментария от поля операндов. В отношении пробелов мой профессор заявил в своем спецификационном листе: «Исходный код находится в свободном формате, и единственным правилом является то, что каждое поле должно быть разделено хотя бы пробелом или вкладкой». Теперь я уверен, как с этим справиться. –

+0

Может быть, вы должны знать, что RSUB не имеет оператора, и поэтому что-нибудь после RSUB должно быть комментарием? – ChrisW

+0

Возможно, вы правы. Может быть, я просто слишком усложняю ситуацию. Большое спасибо! –

-1

Как вы можете определить, является ли текст в определенной строке операндом или комментарием? Это основано на контексте? Например, если OPCODE является «RSUB», вы бы знали, что OPERAND не требуется? После этого вы должны выполнить некоторую магию на операнде основе того, что OPCODE читается:

if (OPCODE == "RSUB") OPERAND.clear(); 
+0

Правильно, мне жаль, что все было так просто.Мне нужно запустить ошибочный исходный код как часть моего проекта. Если после кода RSUB имеется операнд, тогда мне нужно отметить ошибку и распечатать операнд. Если я очищу поле операнда, мне нечего будет печатать. –

+0

В этом случае вам может потребоваться подсчитать пробел между кодом операции и операндом. Если есть более одного, то вы должны предположить, что это комментарий –

Смежные вопросы