gramamr for

This commit is contained in:
AntoHesse 2017-02-22 19:50:29 +01:00
parent 7a849b360a
commit 2fbea4837d
8 changed files with 54 additions and 11 deletions

View file

@ -126,6 +126,7 @@ enum e_sym
END_COMMAND, END_COMMAND,
CONDITION, CONDITION,
COMPLETE_CONDITION, COMPLETE_CONDITION,
FOR_WORDLIST,
ALL = 200, ALL = 200,
}; };

View file

@ -49,11 +49,15 @@ int get_reserved_words(t_list **alst)
token->type = TK_UNTIL; token->type = TK_UNTIL;
else if (ft_strncmp(token->data, "case", 4) == 0) else if (ft_strncmp(token->data, "case", 4) == 0)
token->type = TK_CASE; 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) && ft_strncmp(token->data, "in", 2) == 0)
token->type = TK_IN; token->type = TK_IN;
if (previous_token && previous_token->type == TK_FOR && token->type == TK_WORD)
token->type = TK_NAME;
ante_token = previous_token; ante_token = previous_token;
previous_token = token; previous_token = token;
temp = temp->next; temp = temp->next;

View file

@ -16,6 +16,7 @@ int insert_newline(t_list **alst)
{ {
t_token *token; t_token *token;
DG("insert newline");
token = token_init(); token = token_init();
token->type = TK_NEWLINE; token->type = TK_NEWLINE;
ft_lsteadd(alst, ft_lstnew(token, sizeof(*token))); ft_lsteadd(alst, ft_lstnew(token, sizeof(*token)));

View file

@ -30,7 +30,6 @@ int handle_instruction(int fd)
DG("START: state=%i", parser.state); DG("START: state=%i", parser.state);
while (1) while (1)
{ {
DG("get input");
if ((ret = readline(fd, get_lexer_stack(lexer), &str))) if ((ret = readline(fd, get_lexer_stack(lexer), &str)))
{ {
if (ret == -1) if (ret == -1)
@ -48,7 +47,7 @@ int handle_instruction(int fd)
if (get_lexer_stack(lexer)) if (get_lexer_stack(lexer))
continue ; continue ;
lexer.state = DEFAULT; lexer.state = DEFAULT;
// token_print(token); token_print(token);
if (get_reserved_words(&token)) if (get_reserved_words(&token))
return (1); return (1);
if (insert_newline(&token)) if (insert_newline(&token))
@ -57,6 +56,8 @@ int handle_instruction(int fd)
continue ; continue ;
if (parser.state == SUCCESS) if (parser.state == SUCCESS)
break ; break ;
else if (parser.state == ERROR && !SH_IS_INTERACTIVE(data_singleton()->opts))
return (error_syntax(&token));
else if (parser.state == ERROR) else if (parser.state == ERROR)
error_syntax(&token); error_syntax(&token);
token = NULL; token = NULL;

View file

@ -16,7 +16,9 @@ t_aggrematch g_aggrematch[] =
{ {
{TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0}, {TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0},
{TK_WORD, TK_PIPE, PATTERN, 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_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0},
{TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR}, {TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
{TK_FI, ELSE_PART, IF_CLAUSE, TK_IF}, {TK_FI, ELSE_PART, IF_CLAUSE, TK_IF},
@ -57,6 +59,8 @@ t_aggrematch g_aggrematch[] =
{LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK},
{NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, {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_DO, TK_DO, TK_DO},
{NEWLINE_LIST, TK_IN, TK_IN, TK_IN}, {NEWLINE_LIST, TK_IN, TK_IN, TK_IN},
{NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN}, {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, NEWLINE_LIST, NEWLINE_LIST, NEWLINE},
{NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0}, {NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0},
{NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0}, {NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0},
{NEWLINE_LIST, WORDLIST, SEQUENTIAL_SEP, 0},
{NEWLINE_LIST, TERM, SEPARATOR, 0}, {NEWLINE_LIST, TERM, SEPARATOR, 0},
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0}, {NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION}, {NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION}, {NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0}, {NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK}, {NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
{NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
//to check //to check
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER}, {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}, {CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0},
{SIMPLE_COMMAND, ALL, COMMAND, 0}, {SIMPLE_COMMAND, ALL, COMMAND, 0},
{DO_GROUP, NAME, FOR_CLAUSE, TK_FOR}, {DO_GROUP, NAME, FOR_CLAUSE, TK_FOR},
{DO_GROUP, IN, FOR_CLAUSE, TK_FOR},
{DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR}, {DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR},
{DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR}, {DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR},
{DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST}, {DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST},

View file

@ -19,6 +19,8 @@ t_stackmatch g_stackmatch[] =
{TK_WORD, WORDLIST}, {TK_WORD, WORDLIST},
{TK_WORD, LINEBREAK}, {TK_WORD, LINEBREAK},
{TK_WORD, COMPLETE_COMMANDS}, {TK_WORD, COMPLETE_COMMANDS},
{TK_WORD, TK_IN},
{TK_WORD, FOR_WORDLIST},
{TK_ASSIGNEMENT_WORD, CMD_PREFIX}, {TK_ASSIGNEMENT_WORD, CMD_PREFIX},
{TK_IO_NUMBER, REDIRECT_LIST}, {TK_IO_NUMBER, REDIRECT_LIST},
{TK_IO_NUMBER, CMD_SUFFIX}, {TK_IO_NUMBER, CMD_SUFFIX},
@ -226,13 +228,13 @@ t_stackmatch g_stackmatch[] =
{TK_CASE, SEPARATOR_OP}, {TK_CASE, SEPARATOR_OP},
{TK_CASE, PIPE_SEMI_SEQUENCE}, {TK_CASE, PIPE_SEMI_SEQUENCE},
{TK_IN, TK_WORD}, {TK_IN, TK_WORD},
{TK_IN, NAME},
{TK_ESAC, CASE_LIST}, {TK_ESAC, CASE_LIST},
{TK_ESAC, CASE_LIST_NS}, {TK_ESAC, CASE_LIST_NS},
{TK_ESAC, LINEBREAK}, {TK_ESAC, LINEBREAK},
{TK_WHILE, LINEBREAK}, {TK_WHILE, LINEBREAK},
{TK_WHILE, COMPLETE_COMMANDS}, {TK_WHILE, COMPLETE_COMMANDS},
{TK_WHILE, TK_BANG}, {TK_WHILE, TK_BANG},
{TK_WHILE, TK_BANG},
{TK_WHILE, SEPARATOR_OP}, {TK_WHILE, SEPARATOR_OP},
{TK_WHILE, NEWLINE_LIST}, {TK_WHILE, NEWLINE_LIST},
{TK_WHILE, PIPE_SEMI_SEQUENCE}, {TK_WHILE, PIPE_SEMI_SEQUENCE},
@ -264,10 +266,16 @@ t_stackmatch g_stackmatch[] =
{TK_FOR, SEPARATOR_OP}, {TK_FOR, SEPARATOR_OP},
{TK_FOR, NEWLINE_LIST}, {TK_FOR, NEWLINE_LIST},
{TK_FOR, PIPE_SEMI_SEQUENCE}, {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, LINEBREAK},
{TK_LBRACE, COMPLETE_COMMANDS}, {TK_LBRACE, COMPLETE_COMMANDS},
{TK_LBRACE, TK_BANG}, {TK_LBRACE, TK_BANG},
{TK_LBRACE, TK_BANG},
{TK_LBRACE, SEPARATOR_OP}, {TK_LBRACE, SEPARATOR_OP},
{TK_LBRACE, NEWLINE_LIST}, {TK_LBRACE, NEWLINE_LIST},
{TK_LBRACE, PIPE_SEMI_SEQUENCE}, {TK_LBRACE, PIPE_SEMI_SEQUENCE},
@ -285,6 +293,7 @@ t_stackmatch g_stackmatch[] =
{TK_SEMI, TERM}, {TK_SEMI, TERM},
{TK_SEMI, CMD_NAME}, {TK_SEMI, CMD_NAME},
{TK_SEMI, PROGRAM}, {TK_SEMI, PROGRAM},
{TK_SEMI, FOR_WORDLIST},
{TK_AMP, LIST}, {TK_AMP, LIST},
{TK_AMP, TERM}, {TK_AMP, TERM},
{TK_PIPE, PATTERN}, {TK_PIPE, PATTERN},
@ -345,6 +354,8 @@ t_stackmatch g_stackmatch[] =
{LINEBREAK, COMPOUND_LIST}, {LINEBREAK, COMPOUND_LIST},
{LINEBREAK, PROGRAM}, {LINEBREAK, PROGRAM},
{NEWLINE_LIST, TK_DO}, {NEWLINE_LIST, TK_DO},
{NEWLINE_LIST, SEQUENTIAL_SEP},
{NEWLINE_LIST, FOR_WORDLIST},
{NEWLINE_LIST, TK_IN}, {NEWLINE_LIST, TK_IN},
{NEWLINE_LIST, TK_WHILE}, {NEWLINE_LIST, TK_WHILE},
{NEWLINE_LIST, TK_UNTIL}, {NEWLINE_LIST, TK_UNTIL},
@ -536,7 +547,6 @@ t_stackmatch g_stackmatch[] =
{WHILE_CLAUSE, LINEBREAK}, {WHILE_CLAUSE, LINEBREAK},
{WHILE_CLAUSE, COMPLETE_COMMANDS}, {WHILE_CLAUSE, COMPLETE_COMMANDS},
{WHILE_CLAUSE, TK_BANG}, {WHILE_CLAUSE, TK_BANG},
{WHILE_CLAUSE, TK_BANG},
{WHILE_CLAUSE, SEPARATOR_OP}, {WHILE_CLAUSE, SEPARATOR_OP},
{WHILE_CLAUSE, NEWLINE_LIST}, {WHILE_CLAUSE, NEWLINE_LIST},
{WHILE_CLAUSE, PIPE_SEMI_SEQUENCE}, {WHILE_CLAUSE, PIPE_SEMI_SEQUENCE},
@ -554,7 +564,6 @@ t_stackmatch g_stackmatch[] =
{IF_CLAUSE, LINEBREAK}, {IF_CLAUSE, LINEBREAK},
{IF_CLAUSE, COMPLETE_COMMANDS}, {IF_CLAUSE, COMPLETE_COMMANDS},
{IF_CLAUSE, TK_BANG}, {IF_CLAUSE, TK_BANG},
{IF_CLAUSE, TK_BANG},
{IF_CLAUSE, SEPARATOR_OP}, {IF_CLAUSE, SEPARATOR_OP},
{IF_CLAUSE, NEWLINE_LIST}, {IF_CLAUSE, NEWLINE_LIST},
{IF_CLAUSE, PIPE_SEMI_SEQUENCE}, {IF_CLAUSE, PIPE_SEMI_SEQUENCE},
@ -589,6 +598,7 @@ t_stackmatch g_stackmatch[] =
{WORDLIST, IN}, {WORDLIST, IN},
{IN, LINEBREAK}, {IN, LINEBREAK},
{NAME, TK_FOR}, {NAME, TK_FOR},
{FOR_WORDLIST, NAME},
{FOR_CLAUSE, LINEBREAK}, {FOR_CLAUSE, LINEBREAK},
{FOR_CLAUSE, COMPLETE_COMMANDS}, {FOR_CLAUSE, COMPLETE_COMMANDS},
{FOR_CLAUSE, TK_BANG}, {FOR_CLAUSE, TK_BANG},
@ -596,6 +606,15 @@ t_stackmatch g_stackmatch[] =
{FOR_CLAUSE, SEPARATOR_OP}, {FOR_CLAUSE, SEPARATOR_OP},
{FOR_CLAUSE, NEWLINE_LIST}, {FOR_CLAUSE, NEWLINE_LIST},
{FOR_CLAUSE, PIPE_SEMI_SEQUENCE}, {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, LINEBREAK},
{TERM, COMPLETE_COMMANDS}, {TERM, COMPLETE_COMMANDS},
{COMPOUND_LIST, TK_DO}, {COMPOUND_LIST, TK_DO},

View file

@ -43,7 +43,6 @@ t_prodmatch g_prodmatch[] =
{TK_WORD, TK_BANG, CMD_NAME}, {TK_WORD, TK_BANG, CMD_NAME},
{TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME}, {TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME},
{TK_WORD, SEPARATOR_OP, CMD_NAME}, {TK_WORD, SEPARATOR_OP, CMD_NAME},
{TK_WORD, TK_IN, PATTERN},
{TK_WORD, CASE_LIST, PATTERN}, {TK_WORD, CASE_LIST, PATTERN},
{TK_WORD, TK_PAREN_OPEN, PATTERN}, {TK_WORD, TK_PAREN_OPEN, PATTERN},
{TK_WORD, COMPLETE_COMMANDS, CMD_NAME}, {TK_WORD, COMPLETE_COMMANDS, CMD_NAME},
@ -73,6 +72,9 @@ t_prodmatch g_prodmatch[] =
{TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST}, {TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST},
{TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST}, {TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST},
{TK_NEWLINE, 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, CMD_SUPERIOR, SEPARATOR_OP},
{TK_SEMI, TERM, SEPARATOR_OP}, {TK_SEMI, TERM, SEPARATOR_OP},
{TK_SEMI, LIST, SEPARATOR_OP}, {TK_SEMI, LIST, SEPARATOR_OP},

View file

@ -14,6 +14,16 @@
char *read_state(t_sym current) 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) if (current == 0)
return ("NULL"); return ("NULL");
if (current == PATTERN) if (current == PATTERN)