Правильный способ синтаксического анализа S-выражений в ООП

Я ищу способ реализовать считыватель S-выражений (который будет использоваться позже как с интерпретатором схемы, так и с компилятором), но я Я спрашивал себя, как (если вообще) я должен написать для него AST.

Я читал SICP, и это довольно просто изнутри Scheme, но я хочу реализовать интерпретатор и компилятор на C ++ в стиле объектно-ориентированного программирования.

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

Я видел в некоторых реализациях Scheme, что люди разбирают s-выражения и легко выводят cons-ячейки, примерно так:

  struct Sexpr
  {
  };

  struct Cons : public Sexpr
  {
    Sexpr* left;
    Sexpr* right;
  };

  struct IntAtom : Sexpr
  {
    int value;
  };

И один подкласс Sexpr для каждого типа Scheme Atom или что-то в этом роде. по этим линиям.

Я не уверен, но мне кажется, что это уловка ...Разве эту работу не должен выполнять интерпретатор, а не читатель?

Я хочу знать, считается ли это лучшим (или правильным) способом чтения S-выражений, или это больше работа интерпретатора чем парсер? Следует ли синтаксическому анализатору иметь собственный AST вместо использования cons-ячеек?

5
задан ivanmp 24 February 2012 в 17:38
поделиться