From 8b4481c878b185779d32fe7aa027de3cea3f77a2 Mon Sep 17 00:00:00 2001 From: We-unite <3205135446@qq.com> Date: Mon, 3 Jun 2024 22:09:20 +0800 Subject: run cmd failed --- bcsh.c | 12 ++++++++++ cmd.h | 10 +++----- lex.l | 9 +------- syntax.y | 80 +++++++++++++++++++++++++++++++++++++++++++--------------------- 4 files changed, 70 insertions(+), 41 deletions(-) diff --git a/bcsh.c b/bcsh.c index ca83402..8e0dd32 100644 --- a/bcsh.c +++ b/bcsh.c @@ -7,4 +7,16 @@ int main(int argc, char **argv) { yyparse(); } return 0; +} + +int runcmd(Command *cmd) { + int i; + if (cmd == NULL) { + fprintf(stderr, "cmd is NULL\n"); + } + printf("Run cmd: "); + for (i = 0; i < cmd->argc; i++) { + printf("%s ", cmd->args[i]); + } + printf("\n"); } \ No newline at end of file diff --git a/cmd.h b/cmd.h index adf03c7..c094e04 100644 --- a/cmd.h +++ b/cmd.h @@ -16,15 +16,11 @@ typedef enum { typedef struct Command { CommandType type; // the type of the command char **args; // an array of strings for the arguments of the command + int argc; struct Command *left; // a pointer to the left sub-command struct Command *right; // a pointer to the right sub-command - char *redirect_in; // the file name for input redirection, or NULL if there - // is no input redirection - char *redirect_out; // the file name for output redirection, or NULL if - // there is no output redirection - char *append_out; // the file name for output appending, or NULL if there is - // no output appending - // add more fields as needed } Command; +int runcmd(Command *cmd); + #endif \ No newline at end of file diff --git a/lex.l b/lex.l index 036d58e..230a5b0 100644 --- a/lex.l +++ b/lex.l @@ -9,18 +9,11 @@ void yyerror(const char *s); %% [\t ]+ { /* Ignore whitespace */ } -"\n" { printf("new line\n");return NEWLINE; } +"\n" { return NEWLINE; } "\\\n" { printf("> "); } -">>" { return APPEND_OUT; } -"<<" { return HEREDOC; } -">" { return REDIRECT_OUT; } -"<" { return REDIRECT_IN; } -">>&" { return APPEND_OUTPUT_ERR; } -">&" { return REDIRECT_OUTPUT_ERR; } "|" { return PIPE; } "&&" { return AND; } "||" { return OR; } -"&" { return BACKGROUND; } \"(\\.|[^\"])*\" { yylval.str = strdup(yytext); return STRING; } [a-zA-Z0-9_\-\/.]+ { yylval.str = strdup(yytext); return WORD; } diff --git a/syntax.y b/syntax.y index aa0df71..1ce2223 100644 --- a/syntax.y +++ b/syntax.y @@ -1,50 +1,78 @@ %{ -#include "lex.yy.c" #include "cmd.h" - +#include "lex.yy.c" %} %union { char *str; + struct Command *cmd; + CommandType cmdType; } %token WORD STRING -%token NEWLINE CONTINUATION APPEND_OUT REDIRECT_OUT REDIRECT_IN APPEND_OUTPUT_ERR REDIRECT_OUTPUT_ERR PIPE AND OR BACKGROUND HEREDOC UNKNOWN +%token NEWLINE PIPE AND OR + +%type line command part +%type separator %% line: - command NEWLINE { printf("Parsed a command.\n"); } - | NEWLINE { /* empty line */ } + command NEWLINE { $$ = $1; runcmd($$); } + | NEWLINE { $$ = NULL; } ; command: - part {printf("PART\n"); } - | part separator command { printf("COMMAND\n"); } - | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); } - | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); } - | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); } - | part BACKGROUND { printf("BACKGROUND\n"); } - ; - -tail: - part - | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); } - | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); } - | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); } + part { $$ = $1; } + | part separator command { + $$ = malloc(sizeof(Command)); + $$->type = $2; + $$->left = $1; + $$->right = $3; + } ; part: - part WORD { printf("WORD: %s\n", $2); free($2); } - | part STRING { printf("STRING: %s\n", $2); free($2); } - | WORD { printf("WORD: %s\n", $1); free($1); } - | STRING { printf("STRING: %s\n", $1); free($1); } + part WORD { + $$ = $1; + $$->argc++; + $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); + $$->args[$$->argc - 1] = $2; + $$->args[$$->argc] = NULL; + printf("word[%d] = %s\n", $$->argc-1,$$->args[$$->argc-1]); + } + | part STRING { + $$ = $1; + $$->argc++; + $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); + $$->args[$$->argc - 1] = $2; + $$->args[$$->argc] = NULL; + } + | WORD { + $$ = malloc(sizeof(Command)); + $$->type = CMD_TYPE_NORMAL; + $$->args = malloc(2 * sizeof(char *)); + $$->args[0] = $1; + $$->args[1] = NULL; + $$->argc = 1; + printf("word[%d] = %s\n", $$->argc-1,$$->args[$$->argc-1]); + $$->left = $$->right = NULL; + } + | STRING { + $$ = malloc(sizeof(Command)); + $$->type = CMD_TYPE_NORMAL; + $$->args = malloc(2 * sizeof(char *)); + $$->args[0] = $1; + $$->args[1] = NULL; + $$->argc = 1; + $$->left = $$->right = NULL; + } ; separator: - PIPE { printf("PIPE\n"); } - | AND { printf("AND\n"); } - | OR { printf("OR\n"); } + PIPE { $$ = CMD_TYPE_PIPE; } + | AND { $$ = CMD_TYPE_AND; } + | OR { $$ = CMD_TYPE_OR; } ; -%% \ No newline at end of file +%% -- cgit v1.2.3-70-g09d2