Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Categories:

Продолжаю имплементить while

В AG нужное место нашлось быстро, чисто по имени AG/ExpressionBuilder.ag. Там я определяю, в какой позиции в аппликации стоит подтерм - и генерирую разный С++ в зависимости от того, аргумент у меня или функция.

Налепил быстро два флажка - isTop и isWhile. Теперь есть три ветки - transfromArgument, transformFunction и transformWhile. transformWhile генерирует правильный код для цикла, как и планировалось, без лишнего мусора, который нужен в других двух случаях.

Теперь надо переделать С++ AST, конкретно - CppLocalVarDef, чтобы притти принтер не занимался обнаружением whileF, а был тупым (и, соответственно, не лажал).

Ну а там открываются просторы - надо б инлайнеру запретить инлайнить whileF куда не попадя, а это целая история. whileF у меня идентифицируется меткой, которая абстрактная и конструируется динамически компилятором графов. В-общем, её надо вытащить из компилятора графов и передать в проход оптимизатора. ReaderT какой-нибудь лепить придётся, наверное.

Ну или отказаться от того, чтобы whileF был обычной функцией, сделать специальный конструктор в IR оптимизатора. Что тоже неподъёмно. Буду думать.

Но пока хотя бы сделать так, чтобы если whileF стоит в неправильном месте - генерился старый код вызова ff::whileF. И тогда можно коммит.
Tags: hn0
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments