Оберните инструкции функций некоторым кодом ASM - PullRequest
0 голосов
/ 20 января 2012

Я делаю простой компилятор C как домашнее задание.У меня есть следующее правило грамматики:

function_definition
: type_name declarator compound_statement

Мои семантические правила должны преобразовать его в:

declarator:
  push %ebp
  mov %esp %ebp

  // compound_statement (function instructions)

  pop %ebp
  ret

Поскольку правило compound_statement будет называться до function_definition, я не могу fprintf() работать с инструкциями напрямую в его семантических правилах.Однако я не могу определить ни один streamstring в типах Yacc (см .: мой предыдущий вопрос ).

Итак, как мне сделать, чтобы поместить инструкции функции в строку (легко,не используете strcat, что может привести к путанице на стороне выделения памяти), а затем обернуть их предыдущими инструкциями ASM?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Вы, вероятно, можете написать это правило как:

function_definition:
    type_name declarator
        { fprintf(..function prefix code..); }
    compound_statement
        { fprintf(..function suffix code..); }
;

и по-прежнему напрямую иметь правила для выходного кода component_statement. Проблема заключается в том, что в зависимости от остальной части вашей грамматики это может привести к конфликтам сдвига / уменьшения или уменьшения / уменьшения, поскольку встроенное действие вводит дополнительное нулевое сокращение (для запуска кода действия) перед синтаксическим анализом component_statement.

0 голосов
/ 20 января 2012

Есть два способа:

  • Вы можете создать объект, содержащий представление тела функции внутри кода для правила compound_statement, которое затем передается в качестве аргумента в код правила function_definition, или
  • вы можете использовать расширение GNU для кода среднего правила.
...