diff --git a/bshell/parse/lex.h b/bshell/parse/lex.h index e05232e..7e77021 100644 --- a/bshell/parse/lex.h +++ b/bshell/parse/lex.h @@ -8,6 +8,8 @@ #include #include +#define LEX_STATE_MAX_TERMINATORS 16 + struct line_source; enum lex_flags { @@ -22,6 +24,12 @@ enum lex_token_flags { * expression. a statement that encounters this token as its first char * will switch to arithmetic mode */ LEX_TOKEN_UNARY_ARITHMETIC = 0x02u, + /* if a token has this flag defined, the lexer will + * switch to command mode after encountering it. */ + LEX_TOKEN_COMMAND_MODE = 0x08u, + /* if a token has this flag defined, the lexer will + * switch to statement mode after encountering it. */ + LEX_TOKEN_STATEMENT_MODE = 0x10u, }; enum lex_state_type_id { @@ -30,6 +38,7 @@ enum lex_state_type_id { LEX_STATE_ARITHMETIC = 0x04u, LEX_STATE_STRING = 0x08u, LEX_STATE_WORD = 0x10u, + LEX_STATE_HASHTABLE = 0x20u, }; struct lex_token_def { @@ -50,6 +59,8 @@ struct lex_symbol_node { struct lex_state { const struct lex_state_type *s_type; + unsigned int s_terminators[LEX_STATE_MAX_TERMINATORS]; + unsigned int s_nr_terminators; unsigned int s_paren_depth; fx_queue_entry s_entry; fx_string *s_tempstr; @@ -64,6 +75,7 @@ struct lex_ctx { fx_string *lex_tmp; fx_wchar lex_ch; fx_queue lex_state; + enum token_type lex_prev_token; struct char_cell lex_cursor, lex_start, lex_end; struct lex_symbol_node *lex_sym_tree; enum bshell_status lex_status;