Define token type
@@ -242,6 +242,24 @@ | ||
242 | 242 | |
243 | 243 | /********** Auxiliary Functions for Parser **********/ |
244 | 244 | |
245 | +typedef enum tokentype_T { | |
246 | + TT_UNKNOWN, | |
247 | + TT_END_OF_INPUT, | |
248 | + TT_WORD, | |
249 | + TT_IO_NUMBER, | |
250 | + /* operators */ | |
251 | + TT_NEWLINE, | |
252 | + TT_AMP, TT_AMPAMP, TT_LPAREN, TT_RPAREN, TT_SEMICOLON, TT_DOUBLE_SEMICOLON, | |
253 | + TT_PIPE, TT_PIPEPIPE, TT_LESS, TT_LESSLESS, TT_LESSAMP, TT_LESSLESSDASH, | |
254 | + TT_LESSLESSLESS, TT_LESSGREATER, TT_LESSLPAREN, TT_GREATER, | |
255 | + TT_GREATERGREATER, TT_GREATERGREATERPIPE, TT_GREATERPIPE, TT_GREATERAMP, | |
256 | + TT_GREATERLPAREN, | |
257 | + /* reserved words */ | |
258 | + TT_IF, TT_THEN, TT_ELSE, TT_ELIF, TT_FI, TT_DO, TT_DONE, TT_CASE, TT_ESAC, | |
259 | + TT_WHILE, TT_UNTIL, TT_FOR, TT_LBRACE, TT_RBRACE, TT_BANG, TT_IN, | |
260 | + TT_FUNCTION, | |
261 | +} tokentype_T; | |
262 | + | |
245 | 263 | static wchar_t *skip_name(const wchar_t *s, bool predicate(wchar_t)) |
246 | 264 | __attribute__((pure,nonnull)); |
247 | 265 | static bool is_name_by_predicate(const wchar_t *s, bool predicate(wchar_t)) |
@@ -397,6 +415,8 @@ | ||
397 | 415 | bool error; |
398 | 416 | struct xwcsbuf_T src; |
399 | 417 | size_t index; |
418 | + tokentype_T tokentype; | |
419 | + wordunit_T *token; | |
400 | 420 | struct plist_T pending_heredocs; |
401 | 421 | bool enable_alias, reparse; |
402 | 422 | struct aliaslist_T *aliases; |
@@ -573,6 +593,8 @@ | ||
573 | 593 | .info = info, |
574 | 594 | .error = false, |
575 | 595 | .index = 0, |
596 | + .tokentype = TT_UNKNOWN, | |
597 | + .token = NULL, | |
576 | 598 | .enable_alias = info->enable_alias, |
577 | 599 | .reparse = false, |
578 | 600 | .aliases = NULL, |
@@ -594,6 +616,7 @@ | ||
594 | 616 | wb_destroy(&ps.src); |
595 | 617 | pl_destroy(&ps.pending_heredocs); |
596 | 618 | destroy_aliaslist(ps.aliases); |
619 | + wordfree(ps.token); | |
597 | 620 | |
598 | 621 | switch (ps.info->lastinputresult) { |
599 | 622 | case INPUT_OK: |
@@ -2721,6 +2744,8 @@ | ||
2721 | 2744 | .info = info, |
2722 | 2745 | .error = false, |
2723 | 2746 | .index = 0, |
2747 | + .tokentype = TT_UNKNOWN, | |
2748 | + .token = NULL, | |
2724 | 2749 | .enable_alias = false, |
2725 | 2750 | .reparse = false, |
2726 | 2751 | .aliases = NULL, |
@@ -2738,6 +2763,8 @@ | ||
2738 | 2763 | pl_destroy(&ps.pending_heredocs); |
2739 | 2764 | assert(ps.aliases == NULL); |
2740 | 2765 | //destroy_aliaslist(ps.aliases); |
2766 | + wordfree(ps.token); | |
2767 | + | |
2741 | 2768 | if (ps.info->lastinputresult != INPUT_EOF || ps.error) { |
2742 | 2769 | wordfree(*resultp); |
2743 | 2770 | return false; |