Recursive Descent Parser

Книга 'Modern Compiler Design' - хорошая книга о компиляторах. В ее исходных текстах есть кое-что, что меня раздражает - это AST или Abstract Syntax Tree. Предположим, мы хотим написать парсер выражений с парентезами, который разбирает что-то вроде: ((2+3)*4) * 2! В книге говорится, что у нас есть AST типа:

        ((2+3)*4) * 2
          /   |     \
       (2+3)  *4    * 2
        /     | \
     (2+3)    *  4
     / | \
    2  + 3

Так что я должен сохранить дерево в памяти или просто использовать рекурсивные вызовы; Примечание: если я не сохраню его в памяти, как я могу преобразовать его в машинный код?

Код парсера:

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  -> +|*
18
задан datatype_void 17 July 2017 в 18:04
поделиться