Синтаксический анализ с Flex / Bison часть 2 - PullRequest
1 голос
/ 10 мая 2010

Алло,

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

В случае ввода, компилятор выдает правильный вывод, какой оператор использует, оператор константы или инструктор jmp, к какой метке, теперь я должен написать так, если теперь приходит оператор if, сначала первая команда (перед else) должно быть выдано, когда присваивание if равно yes, тогда оно должно перейти к концу, потому что команда после 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) только для перехода к концу. надеюсь, вы понимаете мою проблему. спасибо.

1 Ответ

3 голосов
/ 18 мая 2010

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

пройти один:

Number Label Satatement
10           if(x==0)
20           WAIT 5
30           JMP (A)
40           WAIT 1
50       A   END
...