Создайте AST из bash в C

Я пытаюсь построить интерпретатор мини-Bash в C без помощи какой-либо причудливой библиотеки (т.е. с нуля). Мне нужно управлять такими простыми операторами, как «<», «|», «<<», «>>», «>» .
Мне было сказано построить AST для ввода данных, чтобы облегчить процесс выполнения. Дело в том, что я не понимаю, как я должен его строить.

До сих пор я сделал связанный список моего ввода, превращенного в токены, но не могу понять, как сделать из него АСТ:

typedef struct       s_token
{
    enum e_TokenType type;
    char             *lexeme;
    struct s_token   *prev;
    struct s_token   *next;
}                    t_token;

Не могли бы вы объяснить мне, как превратить это в функциональный АСТ? Например, с помощью этого ввода:

cat << EOF > file | wc -c | tr -d " " > file2

Я думаю, что АСТ будет выглядеть так:

Я видел другие сообщения, описывающие, как они были, но они были в JS / Python (я не знаком с этими языками) и использую библиотеки для интересующей меня части.

Всего 1 ответ


Я бы создал AST больше так:

                         __ PIPELINE__
                     ___/              \____
                    /                       
            COMMAND                    __ PIPELINE _
          /                          /             
    ARGUMENTS   REDIRECTIONS      COMMAND         _ COMMAND __
        |          |     |           |           /            
       cat        <<     >       ARGUMENTS    ARGUMENTS   REDIRECTIONS
                   |     |         |   |      |   |   |        |
                 "..."  file      wc  -c      tr  -d " "       >
                                                               |
                                                             file2

Заметные отличия от ваших:

  • Команды состоят из списка аргументов и списка перенаправления.
  • Перенаправления имеют тип ( < , > , >> и т. Д.) И либо строку, либо файл в качестве источника / цели.
  • EOF heredoc преобразуется в простой узел строки ( "..." выше). Здесь документ - это просто синтаксический сахар для строки. Если бы я это делал, я бы справился с EOF на этапе лексики и превратил его в простую строку для обработки парсера. EOF не появится в АСТ.

Это грубый эскиз, но идея состоит в том, чтобы представить компоненты более логичным образом. То, как вы нарисовали свои, > и << выглядите как двоичные операторы, а остальные части - операндами. Вот как вы разбираете программу на C, но не команду оболочки.


Есть идеи?

10000