синтаксический анализатор
От: Шебеко Евгений  
Дата: 01.08.04 16:59
Оценка:
Как собственно реализуется сабж?
Вопрос задан больше из любопытства, чем необходимости.

Есть некий скриптовый язык 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++ внутри такой же.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.