Логические выражения и генерация промежуточного кода - PullRequest
0 голосов
/ 22 декабря 2011

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

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

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.

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

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

1 Ответ

1 голос
/ 22 декабря 2011

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

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

...