Как собственно реализуется сабж?
Вопрос задан больше из любопытства, чем необходимости.
Есть некий скриптовый язык tkscript.
http://tkscript.de
Который похож по синтаксису на C++.
Компиляция проходит как обычно: сначала лексичекий анализатор разбирает текст на лексемы,
потом синтаксический анализатор строит дерево синтаксического разбора, потом дерево оптимизируется(Самими нодами дерева).
В лексический анализатор я не вдавался, вероятно там ничего особенного нет.
Дерево разбора тоже вполне осязаемо. Реализзовано ввиде классов. Корень всего class PTNode;
Далее class PTNExpression или PTNStatement. PTNExpression, как я понял то что имеет результат.
PTNStatement то что просто выполняется.
Но вот внести какие-то изменения в синт. анализатор сложно, т.к. он реализован ввиде автомата (я так думаю)
Выглядит это примерно так:
for(int toki=0;i<num_token;toki++)
{
...
tok=tokens[toki];
...
switch(state)
{
case ST_SEQ:
...
case ST_SSEQ: // single statement with TERM token ";"
switch(state_index)
{
case 0:
...
switch(tok)
{
case DXT1_BREAK:
Dpushstate;
state=ST_BREAK;
state_index=0;
break;
...
}
...
}
...
case ST_BREAK:
....
case ST_EXPRSTAT:
...
case ST_CLASSDECL:
...
}
}
Т.е. у чувака есть машина состояний у каждого из состояний есть своё собственное состояние.
В нём и происходит анализ текущеё лексемы. Есть ещё у него логический стек состояний.
В результате разбор выливается в 9000 строк кода, похожие куски встречаются по нескольку раз в разных местах
и это всё очень трудно анализировать.
Вопрос:
Почему нельзя всё это заменить цепочкой вызовов функциональных объектов(или даже просто функций), с их внутренем содержанием
которое известно только им и тем кто их использует? Если разбор на каком-то моменте не удался — генерить исключение.
Перекладывая на плечи компилятора гарантированый и корректный выход из текущей цепочки разбора.
У меня только 3 версии:
1. Машина состояний по каким-то причинам быстрее.
2. Функиональный вариант по каким-то причинам не возможен.
3. Чуваку на момент написания не хватало практики проектирования в C++
P.S.
Вообще какая-то дурная мода делать идеолагически неплохие объектные языки на C или с посредственным
использованием C++. Как пример все реализации JavaScript. даже интерпритатор плюсов (есть такой) тоже на С написан
Неужели компилятор C++ внутри такой же.