User Tag List

Показано с 1 по 10 из 33

Тема: Построение компилятора

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #8
    ZEK
    Гость

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Дерево вот именно для последующих оптимизаций и хочу получить.
    такие оптимизации это порви моск в тряпки, ast впринципе не сложно собирать, но его потом читать надо, еще один промежуточный шаг


    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Пробовал напрямую код генерить, без ОПЗ сложно.
    Генери промежуточный код, тут тоже какие то оптимизации можно делать, замены по шаблонам

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    а для операторов ЯВУ также можно расставить приоритет?
    зачем? операторы последовательно выполняются

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    ОПЗ, как я понимаю, стековый код?
    ну да, парсер к примеру из кода

    "var1 * 5 + var2" может делать что то такое

    ld var1 // загружает переменную на вершиу стека
    const 5 // ложит на вершину стека константу
    mul // берет 2 значения с верхушки стека, перемножает и ложит результат обратно
    ld var2
    add

    это на промежуточном коде, его потом в ассемблер перевести не проблема

    приортитеты можешь не париться, надо просто правильно нарисовать правила для coco/r, он сам разберет по приоритетам сырок

    ---------- Post added at 16:51 ---------- Previous post was at 16:40 ----------

    Вот пример разбора сишного сырка по сишным приоритетам

    Код:
    Expr       = AssignExpr {','  AssignExpr}.
    AssignExpr = CondExpr [AssignOp AssignExpr]. // relaxed
    CondExpr   = LogOrExpr ['?' Expr ':' CondExpr].
    LogOrExpr  = LogAndExpr {"||" LogAndExpr}.
    LogAndExpr = OrExpr {"&&" OrExpr}.
    OrExpr     = XorExpr {'|' XorExpr}.
    XorExpr    = AndExpr {'^' AndExpr}.
    AndExpr    = EqlExpr {'&' EqlExpr}.
    EqlExpr    = RelExpr {("==" | "!=") RelExpr}.
    RelExpr    = ShiftExpr {('<' | '>' | "<=" | ">=") ShiftExpr}.
    ShiftExpr  = AddExpr {("<<" | ">>") AddExpr}.
    AddExpr    = MultExpr {('+' | '-') MultExpr}.
    MultExpr   = CastExpr {('*' | '/' | '%') CastExpr}.
    CastExpr   = IF(IsType1()) '(' TypeName ')' CastExpr
               | UnaryExpr.
    
    UnaryExpr =
      {"++" | "--"}
      ( PostfixExpr
      | UnaryOp CastExpr
      | "sizeof"  (IF(IsType1()) '(' TypeName ')' | UnaryExpr)
      ).
    
    PostfixExpr =
      Primary
      { '[' Expr ']' 
      | '.'  ident
      | "->" ident
      | '(' [ArgExprList] ')' 
      | "++" 
      | "--"
      }.
    Приоритет формируется порядком вложенности одних лексем в другие
    Последний раз редактировалось ZEK; 26.11.2013 в 17:43.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Interference:построение таблицы
    от goblinish в разделе Программирование
    Ответов: 6
    Последнее: 17.11.2012, 13:43
  2. Кодогенерация SDCC: пожелания об улучшении компилятора
    от Oleg N. Cher в разделе Программирование
    Ответов: 99
    Последнее: 10.11.2012, 16:05
  3. 3D-View - построение 3D перспективы
    от Andrew771 в разделе Софт
    Ответов: 4
    Последнее: 02.11.2012, 11:46
  4. Конструктор для компилятора с Си
    от Raydac в разделе Программирование
    Ответов: 0
    Последнее: 21.12.2009, 23:14

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •