gramamr for
This commit is contained in:
parent
7a849b360a
commit
2fbea4837d
8 changed files with 54 additions and 11 deletions
|
|
@ -126,6 +126,7 @@ enum e_sym
|
|||
END_COMMAND,
|
||||
CONDITION,
|
||||
COMPLETE_CONDITION,
|
||||
FOR_WORDLIST,
|
||||
ALL = 200,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -49,11 +49,15 @@ int get_reserved_words(t_list **alst)
|
|||
token->type = TK_UNTIL;
|
||||
else if (ft_strncmp(token->data, "case", 4) == 0)
|
||||
token->type = TK_CASE;
|
||||
else if (ft_strncmp(token->data, "for", 3) == 0)
|
||||
token->type = TK_FOR;
|
||||
}
|
||||
}
|
||||
if (ante_token && ante_token->type == TK_CASE
|
||||
if (ante_token && (ante_token->type == TK_CASE || ante_token->type == TK_FOR)
|
||||
&& ft_strncmp(token->data, "in", 2) == 0)
|
||||
token->type = TK_IN;
|
||||
if (previous_token && previous_token->type == TK_FOR && token->type == TK_WORD)
|
||||
token->type = TK_NAME;
|
||||
ante_token = previous_token;
|
||||
previous_token = token;
|
||||
temp = temp->next;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ int insert_newline(t_list **alst)
|
|||
{
|
||||
t_token *token;
|
||||
|
||||
DG("insert newline");
|
||||
token = token_init();
|
||||
token->type = TK_NEWLINE;
|
||||
ft_lsteadd(alst, ft_lstnew(token, sizeof(*token)));
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ int handle_instruction(int fd)
|
|||
DG("START: state=%i", parser.state);
|
||||
while (1)
|
||||
{
|
||||
DG("get input");
|
||||
if ((ret = readline(fd, get_lexer_stack(lexer), &str)))
|
||||
{
|
||||
if (ret == -1)
|
||||
|
|
@ -48,7 +47,7 @@ int handle_instruction(int fd)
|
|||
if (get_lexer_stack(lexer))
|
||||
continue ;
|
||||
lexer.state = DEFAULT;
|
||||
// token_print(token);
|
||||
token_print(token);
|
||||
if (get_reserved_words(&token))
|
||||
return (1);
|
||||
if (insert_newline(&token))
|
||||
|
|
@ -57,7 +56,9 @@ int handle_instruction(int fd)
|
|||
continue ;
|
||||
if (parser.state == SUCCESS)
|
||||
break ;
|
||||
else if (parser.state == ERROR)
|
||||
else if (parser.state == ERROR && !SH_IS_INTERACTIVE(data_singleton()->opts))
|
||||
return (error_syntax(&token));
|
||||
else if (parser.state == ERROR)
|
||||
error_syntax(&token);
|
||||
token = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,9 @@ t_aggrematch g_aggrematch[] =
|
|||
{
|
||||
{TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0},
|
||||
{TK_WORD, TK_PIPE, PATTERN, 0},
|
||||
{TK_WORD, WORDLIST, WORDLIST, 0},
|
||||
{TK_WORD, TK_IN, FOR_WORDLIST, TK_IN},
|
||||
{TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST},
|
||||
{TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
||||
{TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0},
|
||||
{TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
|
||||
{TK_FI, ELSE_PART, IF_CLAUSE, TK_IF},
|
||||
|
|
@ -57,6 +59,8 @@ t_aggrematch g_aggrematch[] =
|
|||
{LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
|
||||
{LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK},
|
||||
{NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME},
|
||||
{NEWLINE_LIST, SEQUENTIAL_SEP, SEQUENTIAL_SEP, SEQUENTIAL_SEP},
|
||||
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
|
||||
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
|
||||
{NEWLINE_LIST, TK_IN, TK_IN, TK_IN},
|
||||
{NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN},
|
||||
|
|
@ -68,13 +72,13 @@ t_aggrematch g_aggrematch[] =
|
|||
{NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE},
|
||||
{NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0},
|
||||
{NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0},
|
||||
{NEWLINE_LIST, WORDLIST, SEQUENTIAL_SEP, 0},
|
||||
{NEWLINE_LIST, TERM, SEPARATOR, 0},
|
||||
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
|
||||
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
|
||||
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
|
||||
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
|
||||
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
|
||||
{NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
||||
|
||||
//to check
|
||||
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER},
|
||||
|
|
@ -135,6 +139,7 @@ t_aggrematch g_aggrematch[] =
|
|||
{CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0},
|
||||
{SIMPLE_COMMAND, ALL, COMMAND, 0},
|
||||
{DO_GROUP, NAME, FOR_CLAUSE, TK_FOR},
|
||||
{DO_GROUP, IN, FOR_CLAUSE, TK_FOR},
|
||||
{DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR},
|
||||
{DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR},
|
||||
{DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST},
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ t_stackmatch g_stackmatch[] =
|
|||
{TK_WORD, WORDLIST},
|
||||
{TK_WORD, LINEBREAK},
|
||||
{TK_WORD, COMPLETE_COMMANDS},
|
||||
{TK_WORD, TK_IN},
|
||||
{TK_WORD, FOR_WORDLIST},
|
||||
{TK_ASSIGNEMENT_WORD, CMD_PREFIX},
|
||||
{TK_IO_NUMBER, REDIRECT_LIST},
|
||||
{TK_IO_NUMBER, CMD_SUFFIX},
|
||||
|
|
@ -226,13 +228,13 @@ t_stackmatch g_stackmatch[] =
|
|||
{TK_CASE, SEPARATOR_OP},
|
||||
{TK_CASE, PIPE_SEMI_SEQUENCE},
|
||||
{TK_IN, TK_WORD},
|
||||
{TK_IN, NAME},
|
||||
{TK_ESAC, CASE_LIST},
|
||||
{TK_ESAC, CASE_LIST_NS},
|
||||
{TK_ESAC, LINEBREAK},
|
||||
{TK_WHILE, LINEBREAK},
|
||||
{TK_WHILE, COMPLETE_COMMANDS},
|
||||
{TK_WHILE, TK_BANG},
|
||||
{TK_WHILE, TK_BANG},
|
||||
{TK_WHILE, SEPARATOR_OP},
|
||||
{TK_WHILE, NEWLINE_LIST},
|
||||
{TK_WHILE, PIPE_SEMI_SEQUENCE},
|
||||
|
|
@ -264,10 +266,16 @@ t_stackmatch g_stackmatch[] =
|
|||
{TK_FOR, SEPARATOR_OP},
|
||||
{TK_FOR, NEWLINE_LIST},
|
||||
{TK_FOR, PIPE_SEMI_SEQUENCE},
|
||||
{TK_FOR, TK_DO},
|
||||
{TK_FOR, TK_WHILE},
|
||||
{TK_FOR, COMPOUND_LIST},
|
||||
{TK_FOR, TK_IF},
|
||||
{TK_FOR, TK_ELIF},
|
||||
{TK_FOR, TK_THEN},
|
||||
{TK_FOR, COMPLETE_CONDITION},
|
||||
{TK_LBRACE, LINEBREAK},
|
||||
{TK_LBRACE, COMPLETE_COMMANDS},
|
||||
{TK_LBRACE, TK_BANG},
|
||||
{TK_LBRACE, TK_BANG},
|
||||
{TK_LBRACE, SEPARATOR_OP},
|
||||
{TK_LBRACE, NEWLINE_LIST},
|
||||
{TK_LBRACE, PIPE_SEMI_SEQUENCE},
|
||||
|
|
@ -285,6 +293,7 @@ t_stackmatch g_stackmatch[] =
|
|||
{TK_SEMI, TERM},
|
||||
{TK_SEMI, CMD_NAME},
|
||||
{TK_SEMI, PROGRAM},
|
||||
{TK_SEMI, FOR_WORDLIST},
|
||||
{TK_AMP, LIST},
|
||||
{TK_AMP, TERM},
|
||||
{TK_PIPE, PATTERN},
|
||||
|
|
@ -345,6 +354,8 @@ t_stackmatch g_stackmatch[] =
|
|||
{LINEBREAK, COMPOUND_LIST},
|
||||
{LINEBREAK, PROGRAM},
|
||||
{NEWLINE_LIST, TK_DO},
|
||||
{NEWLINE_LIST, SEQUENTIAL_SEP},
|
||||
{NEWLINE_LIST, FOR_WORDLIST},
|
||||
{NEWLINE_LIST, TK_IN},
|
||||
{NEWLINE_LIST, TK_WHILE},
|
||||
{NEWLINE_LIST, TK_UNTIL},
|
||||
|
|
@ -536,7 +547,6 @@ t_stackmatch g_stackmatch[] =
|
|||
{WHILE_CLAUSE, LINEBREAK},
|
||||
{WHILE_CLAUSE, COMPLETE_COMMANDS},
|
||||
{WHILE_CLAUSE, TK_BANG},
|
||||
{WHILE_CLAUSE, TK_BANG},
|
||||
{WHILE_CLAUSE, SEPARATOR_OP},
|
||||
{WHILE_CLAUSE, NEWLINE_LIST},
|
||||
{WHILE_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||
|
|
@ -554,7 +564,6 @@ t_stackmatch g_stackmatch[] =
|
|||
{IF_CLAUSE, LINEBREAK},
|
||||
{IF_CLAUSE, COMPLETE_COMMANDS},
|
||||
{IF_CLAUSE, TK_BANG},
|
||||
{IF_CLAUSE, TK_BANG},
|
||||
{IF_CLAUSE, SEPARATOR_OP},
|
||||
{IF_CLAUSE, NEWLINE_LIST},
|
||||
{IF_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||
|
|
@ -589,6 +598,7 @@ t_stackmatch g_stackmatch[] =
|
|||
{WORDLIST, IN},
|
||||
{IN, LINEBREAK},
|
||||
{NAME, TK_FOR},
|
||||
{FOR_WORDLIST, NAME},
|
||||
{FOR_CLAUSE, LINEBREAK},
|
||||
{FOR_CLAUSE, COMPLETE_COMMANDS},
|
||||
{FOR_CLAUSE, TK_BANG},
|
||||
|
|
@ -596,6 +606,15 @@ t_stackmatch g_stackmatch[] =
|
|||
{FOR_CLAUSE, SEPARATOR_OP},
|
||||
{FOR_CLAUSE, NEWLINE_LIST},
|
||||
{FOR_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||
{FOR_CLAUSE, TK_DO},
|
||||
{FOR_CLAUSE, TK_WHILE},
|
||||
{FOR_CLAUSE, TK_UNTIL},
|
||||
{FOR_CLAUSE, TK_IF},
|
||||
{FOR_CLAUSE, TK_ELIF},
|
||||
{FOR_CLAUSE, TK_THEN},
|
||||
{FOR_CLAUSE, TK_ELSE},
|
||||
{FOR_CLAUSE, COMPOUND_LIST},
|
||||
{FOR_CLAUSE, COMPLETE_CONDITION},
|
||||
{TERM, LINEBREAK},
|
||||
{TERM, COMPLETE_COMMANDS},
|
||||
{COMPOUND_LIST, TK_DO},
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ t_prodmatch g_prodmatch[] =
|
|||
{TK_WORD, TK_BANG, CMD_NAME},
|
||||
{TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME},
|
||||
{TK_WORD, SEPARATOR_OP, CMD_NAME},
|
||||
{TK_WORD, TK_IN, PATTERN},
|
||||
{TK_WORD, CASE_LIST, PATTERN},
|
||||
{TK_WORD, TK_PAREN_OPEN, PATTERN},
|
||||
{TK_WORD, COMPLETE_COMMANDS, CMD_NAME},
|
||||
|
|
@ -73,6 +72,9 @@ t_prodmatch g_prodmatch[] =
|
|||
{TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST},
|
||||
{TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST},
|
||||
{TK_NEWLINE, CONDITION, NEWLINE_LIST},
|
||||
{TK_NEWLINE, FOR_WORDLIST, NEWLINE_LIST},
|
||||
{TK_NEWLINE, SEQUENTIAL_SEP, NEWLINE_LIST},
|
||||
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
|
||||
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
|
||||
{TK_SEMI, TERM, SEPARATOR_OP},
|
||||
{TK_SEMI, LIST, SEPARATOR_OP},
|
||||
|
|
|
|||
|
|
@ -14,6 +14,16 @@
|
|||
|
||||
char *read_state(t_sym current)
|
||||
{
|
||||
if (current == FOR_WORDLIST)
|
||||
return ("FOR_WORDLIST");
|
||||
if (current == FOR_CLAUSE)
|
||||
return ("FOR_CLAUSE");
|
||||
if (current == TK_NAME)
|
||||
return ("TK_NAME");
|
||||
if (current == TK_FOR)
|
||||
return ("FOR");
|
||||
if (current == NAME)
|
||||
return ("NAME");
|
||||
if (current == 0)
|
||||
return ("NULL");
|
||||
if (current == PATTERN)
|
||||
|
|
|
|||
Loading…
Reference in a new issue