2016-11-16 3 views
0

Я хочу осуществитьКак реализовать инструкции Скачок Лекса и Yacc

   DJNZ R1,LABEL 

Это означает, что декремент R1 и переход на метку, если результат декремента не равен нулю.

У меня есть файл lex, который генерирует токены DJNZ, REG и LABEL.

В файле YACC у меня есть:

 Jump_instr: DJNZ REG ',' LABEL {regmem[regIdx] = regmem[regIdx] -1;          
              if (regmem[regIdx] != 0) 
               { goto label;}} 

Iam не уверен, как поступить. Любое предложение пожалуйста.

ответ

0

Когда ваш парсер встречает метку, вам нужно добавить ее в хеш-таблицу (обычно называемую таблицей символов) с соответствующим указателем инструкции. Поскольку это, как представляется, является интерпретатором без AST, указатель вашей команды будет индексом первого символа первой инструкции после метки (см. this answer для одного из возможных способов получения позиции маркера). Чтобы «перейти» к этой метке, вы затем просматриваете ее в таблице символов и перезапускаете интерпретатор в этом индексе. Вы не сможете сделать это с помощью меток C, потому что они должны быть известны при компиляции интерпретатора.

Кроме того, в его нынешнем виде ваш переводчик сможет только вернуться назад. Вы можете обрабатывать переходы вперед, запустив два прохода: первый для создания таблицы символов и второй для фактического выполнения каждой команды.

+0

Да, спасибо. Но я не уверен, как добавить инструкции в таблицу Hash. Потому что LABEL может быть другим АСТ. также, если DJNZ - ZERO, тогда он должен продолжить следующие инструкции. Можете ли вы предложить мне несколько ссылок, чтобы я мог пройти через лучшее понимание. – Shilpa

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