Я ищу способ реализовать считыватель 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-ячеек?