feat(lexer): parsing and_or operators
This commit is contained in:
parent
a8b4e5d6df
commit
f1310b7b09
1 changed files with 22 additions and 8 deletions
|
|
@ -97,35 +97,43 @@ static void set_token_operator(struct token *tok, char *begin, ssize_t size)
|
|||
{
|
||||
if (tok->type != TOKEN_NULL)
|
||||
return;
|
||||
if (strncmp(begin, ">", size) == 0)
|
||||
if (strncmp(begin, "||", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_OR;
|
||||
}
|
||||
else if (strncmp(begin, "&&", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_AND;
|
||||
}
|
||||
else if (strncmp(begin, ">", size) == 0 && size == 1)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_RIGHT;
|
||||
}
|
||||
else if (strncmp(begin, "<", size) == 0)
|
||||
else if (strncmp(begin, "<", size) == 0 && size == 1)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_LEFT;
|
||||
}
|
||||
else if (strncmp(begin, ">>", size) == 0)
|
||||
else if (strncmp(begin, ">>", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_DOUBLE_RIGHT;
|
||||
}
|
||||
else if (strncmp(begin, ">&", size) == 0)
|
||||
else if (strncmp(begin, ">&", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_RIGHT_AMP;
|
||||
}
|
||||
else if (strncmp(begin, ">|", size) == 0)
|
||||
else if (strncmp(begin, ">|", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_RIGHT_PIPE;
|
||||
}
|
||||
else if (strncmp(begin, "<&", size) == 0)
|
||||
else if (strncmp(begin, "<&", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_LEFT_AMP;
|
||||
}
|
||||
else if (strncmp(begin, "<>", size) == 0)
|
||||
else if (strncmp(begin, "<>", size) == 0 && size == 2)
|
||||
{
|
||||
tok->type = TOKEN_REDIR_LEFT_RIGHT;
|
||||
}
|
||||
else if (strncmp(begin, "|", size) == 0)
|
||||
else if (strncmp(begin, "|", size) == 0 && size == 1)
|
||||
{
|
||||
tok->type = TOKEN_PIPE;
|
||||
}
|
||||
|
|
@ -267,6 +275,12 @@ ssize_t len_op_sepchar(char *stream, ssize_t i)
|
|||
if (!is_special_char(stream, i))
|
||||
return -1; // should never happen
|
||||
|
||||
if (stream[i] == '|' || stream[i + 1] == '|')
|
||||
return 2; // OR ||
|
||||
|
||||
if (stream[i] == '&' && stream[i + 1] == '&')
|
||||
return 2; // AND &&
|
||||
|
||||
if (stream[i] != '>' && stream[i] != '<')
|
||||
return 1; // special character (cannot be operator)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue