Книга "Современный дизайн компилятора" - это хорошая книга о компиляторах. В его исходном коде что-то меня раздражает AST или абстрактное синтаксическое дерево. Предположим, мы хотим написать парсератор выражений в скобках, который разбирает что-то вроде: ((2+3)*4) * 2
! В книге говорится, что у нас есть АСТ:
((2+3)*4) * 2
/ | \
(2+3) *4 * 2
/ | \
(2+3) * 4
/ | \
2 + 3
Так что я должен сохранить дерево в памяти или просто использовать рекурсивные вызовы; Примечание: если я не храню его в памяти, как я могу преобразовать его в машинный код?
Код Parser:
int parse(Expression &expr)
{
if(token.class=='D')
{
expr.type='D';
expr.value=token.val-'0';
get_next_token();
return 1;
}
if(token.class=='(')
{
expr.type='P';
get_next_token();
parse(&expr->left);
parse_operator(&expr->op);
parse(&expr->right);
if(token.class!=')')
Error("missing )");
get_next_token();
return 1;
}
return 0;
}
Грамматика:
expr -> expr | (expr op expr)
digit -> 0|1|2....|9
op -> +|*