2010-05-10 2 views
1

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

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

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

Ввод adr. Выход

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 exp jmp_stmt_end stmt_seq END 

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

ответ

3

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

проходят один:

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

+1. Этот процесс называется «backpatching», и, хотя он ** может быть выполнен за один проход, предлагаемый здесь двухпроходный подход намного проще реализовать и работает так же хорошо. –

Смежные вопросы