Логические выражения и генерация промежуточного кода

Мне удалось получить лексер, средство проверки синтаксиса и семантику, и теперь я хочу перейти к генерации промежуточного кода. Проблема в том, что я не знаю, как обрабатывать логические выражения. Я читал кое-что о E.true и E.false. Этот пример есть везде, но я его не понял.

Например, если у меня есть следующий код

if x>y and x<y or x == 1 then
    //super duper code here
    x = x+1    
else
    //super duper wow code here
    y = y+1
endif

Результат должен быть примерно таким

1: > x y 3
2: jmp _ _ 9
3: < x y 7
4: jmp _ _ 5
5: == x 1 _
6: jmp _ _ 9
7: + 1 x $1
8: = $1 _ x
9: + 1 y $2
10: = $2 _ y

но метки для переходов неизвестны, пока вы не закончите анализ оператора if.

Поэтому мне нужно сгенерировать квадроциклы, а затем исправить их. Как я могу сделать это с помощью грамматики этого сообщения?

Может кто-нибудь объяснить, как это пойдет, потому что я действительно запутался.


person bottled_ghost    schedule 21.12.2011    source источник
comment
Следует ли добавить и к этому вопросу тег домашнего задания?   -  person AusCBloke    schedule 22.12.2011


Ответы (1)


Да, вы должны создавать цели ветвления, которые являются символами / метками. Если ваш промежуточный язык (IL) поддерживает это, то вам, вероятно, вообще не следует использовать расположение числовых инструкций. (Числовое расположение промежуточных инструкций не помогает при генерации окончательного кода ... потому что они не отображаются просто на адреса / смещения для окончательных инструкций.)

Другой намек состоит в том, что многие конструкции включают последовательное выполнение, включая большинство типов простых выражений. Так что это упростило бы ситуацию, если бы IL поддержал это; т.е. отсутствие целевой метки означает переход к следующей инструкции. Это упростит генерацию кода последовательностей IL.

person Stephen C    schedule 22.12.2011
comment
Можете привести пример с кодом, который у меня в посте? - person bottled_ghost; 22.12.2011
comment
Как мило с твоей стороны. Вы мне очень помогли. Я не просил вас писать за меня код. Я сам разобрался. - person bottled_ghost; 24.12.2011