在C中用bash创建一个AST

tbl*_*dez 9 c bash abstract-syntax-tree

我试图在没有任何花哨库(即从头开始)的帮助下在C中构建一个迷你Bash解释器.我必须管理简单的运算符,如'<','|','<<','>>','>'.
我被告知要构建输入的AST以便于执行过程.问题是,我不明白我应该如何构建一个.

到目前为止,我制作了一个链接列表,我的输入变成了令牌,但无法想出如何制作AST:

typedef struct       s_token
{
    enum e_TokenType type;
    char             *lexeme;
    struct s_token   *prev;
    struct s_token   *next;
}                    t_token;
Run Code Online (Sandbox Code Playgroud)

你能解释一下如何把它变成一个功能AST吗?例如,使用此输入:

cat << EOF > file | wc -c | tr -d " " > file2
Run Code Online (Sandbox Code Playgroud)

我想AST会是这样的:

我已经看到其他帖子描述了如何但他们在JS/Python(我不熟悉这些语言)和使用库感兴趣的部分.

Joh*_*ica 7

我会创建一个更像这样的AST:

                         __ PIPELINE__
                     ___/              \____
                    /                       \
            COMMAND                    __ PIPELINE _
          /        \                  /             \
    ARGUMENTS   REDIRECTIONS      COMMAND         _ COMMAND __
        |          |     |           |           /            \
       cat        <<     >       ARGUMENTS    ARGUMENTS   REDIRECTIONS
                   |     |         |   |      |   |   |        |
                 "..."  file      wc  -c      tr  -d " "       >
                                                               |
                                                             file2
Run Code Online (Sandbox Code Playgroud)

与您的显着差异:

  • 命令由参数列表和重定向列表组成.
  • 重定向具有类型(<,>,>>等)和一个字符串或一个文件作为源/目标.
  • 所述EOF定界符被转换成纯字符串节点("..."上文).这里的文档最终只是字符串的语法糖.如果我这样做,我会处理EOFlexing阶段并将其转换为一个简单的字符串供解析器处理.EOF不会出现在AST中.

这是一个粗略的草图,但其想法是以更合理的方式表示组件.你的方式吸引你的,>并且<<看起来与其他作品作为操作数的二元运算符.这就是你解析C程序的方法,但不是shell命令.