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(我不熟悉这些语言)和使用库感兴趣的部分.
我会创建一个更像这样的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命令.