2011-12-21 2 views
0

Мне удалось получить lexer, синтаксическую проверку и семантику, и теперь я хочу перейти к созданию промежуточного кода. Проблема в том, что я не знаю, как обращаться с логическими выражениями. Я кое-что прочитал о 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 

но этикетки для прыжков не известны, пока вы на самом деле закончить разбор, если заявление ,

Так что я должен сгенерировать квадроциклы, а затем отложить их. Как я могу это сделать с грамматикой этого post?

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

+1

Должна ли добавляться и домашняя тега к этому вопросу? – AusCBloke

+0

@AusCBloke fixed – Takatakas

ответ

1

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

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

+0

Можете привести пример с кодом, который у меня есть в моем посте? – Takatakas

+0

@ Такатакас - нет, я не мог. Это ВАША домашняя работа, а не моя. –

+0

Как мило с вашей стороны. Вы очень помогли. Я не просил вас написать код для меня. Я понял это сам. – Takatakas