Синтаксический анализ с помощью Flex/Bison, часть 2

Привет,

Мне нужна помощь в программировании Lex/Yacc. Я написал компилятор для синтаксического анализа входных данных многих операторов. Теперь у меня особая проблема.

В случае ввода компилятор выдает правильный вывод, какой оператор использует, постоянный оператор или инструктор jmp для какой метки, теперь я должен написать так, если теперь приходит оператор if, сначала первая команда (перед еще) должно быть выдано, когда назначение if да, тогда оно должно перейти в конец, потому что команда после else не нужна, поэтому после этого jmp должна быть выдана вторая команда. Я покажу это на примере, может быть, вы понимаете, что я имею в виду.

Ввести адр. Выход

if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END

вот так. У меня есть идея, может быть, я могу сделать это с помощью специального оператора if, например

IF exp jmp_stmt_end stmt_seq END

когда во входных данных указан оператор if, компилятор должен распознать конец оператора, как и мой jmp_stmt в моем компиляторе (вы должны загрузить файлы с http://bitbucket.org/matrix/changed-tiny) только для перехода в конец. Надеюсь, вы понимаете мою проблему. Спасибо.


person Imran    schedule 10.05.2010    source источник


Ответы (1)


Я бы сделал это с помощью двухэтапного вывода: первый проход будет генерировать список с каждым оператором вывода, где цели перехода кодируются метками, и второй проход, где этот список используется для создания реального вывода. Что-то вроде этого:

пройти один:

Number Label Satatement
10           if(x==0)
20           WAIT 5
30           JMP (A)
40           WAIT 1
50       A   END
person Rudi    schedule 18.05.2010
comment
+1. Этот процесс называется обратным исправлением, и, хотя его можно выполнить за один проход, предложенный здесь двухпроходный подход гораздо проще в реализации и работает так же хорошо. - person Chris Tonkinson; 03.06.2010