
Сообщение от
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] ')'
| "++"
| "--"
}.
Приоритет формируется порядком вложенности одних лексем в другие