1 1.7 christos /* $NetBSD: lex.h,v 1.7 2005/09/11 22:16:00 christos Exp $ */ 2 1.2 tls 3 1.1 jtc /* 4 1.1 jtc * Source input, lexer and parser 5 1.1 jtc */ 6 1.1 jtc 7 1.7 christos /* $Id: lex.h,v 1.7 2005/09/11 22:16:00 christos Exp $ */ 8 1.1 jtc 9 1.1 jtc #define IDENT 64 10 1.1 jtc 11 1.1 jtc typedef struct source Source; 12 1.1 jtc struct source { 13 1.1 jtc const char *str; /* input pointer */ 14 1.1 jtc int type; /* input type */ 15 1.3 hubertf const char *start; /* start of current buffer */ 16 1.1 jtc union { 17 1.1 jtc char **strv; /* string [] */ 18 1.1 jtc struct shf *shf; /* shell file */ 19 1.2 tls struct tbl *tblp; /* alias (SALIAS) */ 20 1.1 jtc char *freeme; /* also for SREREAD */ 21 1.1 jtc } u; 22 1.2 tls char ugbuf[2]; /* buffer for ungetsc() (SREREAD) and 23 1.2 tls * alias (SALIAS) */ 24 1.1 jtc int line; /* line number */ 25 1.4 wiz int errline; /* line the error occurred on (0 if not set) */ 26 1.1 jtc const char *file; /* input file name */ 27 1.1 jtc int flags; /* SF_* */ 28 1.1 jtc Area *areap; 29 1.1 jtc XString xs; /* input buffer */ 30 1.1 jtc Source *next; /* stacked source */ 31 1.1 jtc }; 32 1.1 jtc 33 1.1 jtc /* Source.type values */ 34 1.1 jtc #define SEOF 0 /* input EOF */ 35 1.1 jtc #define SFILE 1 /* file input */ 36 1.1 jtc #define SSTDIN 2 /* read stdin */ 37 1.1 jtc #define SSTRING 3 /* string */ 38 1.1 jtc #define SWSTR 4 /* string without \n */ 39 1.1 jtc #define SWORDS 5 /* string[] */ 40 1.6 mycroft #define SWORDSEP 6 /* string[] separator */ 41 1.1 jtc #define SALIAS 7 /* alias expansion */ 42 1.1 jtc #define SREREAD 8 /* read ahead to be re-scanned */ 43 1.1 jtc 44 1.1 jtc /* Source.flags values */ 45 1.1 jtc #define SF_ECHO BIT(0) /* echo input to shlout */ 46 1.1 jtc #define SF_ALIAS BIT(1) /* faking space at end of alias */ 47 1.1 jtc #define SF_ALIASEND BIT(2) /* faking space at end of alias */ 48 1.1 jtc #define SF_TTY BIT(3) /* type == SSTDIN & it is a tty */ 49 1.1 jtc 50 1.1 jtc /* 51 1.1 jtc * states while lexing word 52 1.1 jtc */ 53 1.1 jtc #define SBASE 0 /* outside any lexical constructs */ 54 1.1 jtc #define SWORD 1 /* implicit quoting for substitute() */ 55 1.2 tls #ifdef KSH 56 1.3 hubertf #define SLETPAREN 2 /* inside (( )), implicit quoting */ 57 1.2 tls #endif /* KSH */ 58 1.1 jtc #define SSQUOTE 3 /* inside '' */ 59 1.1 jtc #define SDQUOTE 4 /* inside "" */ 60 1.1 jtc #define SBRACE 5 /* inside ${} */ 61 1.3 hubertf #define SCSPAREN 6 /* inside $() */ 62 1.1 jtc #define SBQUOTE 7 /* inside `` */ 63 1.3 hubertf #define SASPAREN 8 /* inside $(( )) */ 64 1.1 jtc #define SHEREDELIM 9 /* parsing <<,<<- delimiter */ 65 1.1 jtc #define SHEREDQUOTE 10 /* parsing " in <<,<<- delimiter */ 66 1.1 jtc #define SPATTERN 11 /* parsing *(...|...) pattern (*+?@!) */ 67 1.1 jtc #define STBRACE 12 /* parsing ${..[#%]..} */ 68 1.1 jtc 69 1.1 jtc typedef union { 70 1.1 jtc int i; 71 1.1 jtc char *cp; 72 1.1 jtc char **wp; 73 1.1 jtc struct op *o; 74 1.1 jtc struct ioword *iop; 75 1.1 jtc } YYSTYPE; 76 1.1 jtc 77 1.1 jtc /* If something is added here, add it to tokentab[] in syn.c as well */ 78 1.1 jtc #define LWORD 256 79 1.1 jtc #define LOGAND 257 /* && */ 80 1.1 jtc #define LOGOR 258 /* || */ 81 1.1 jtc #define BREAK 259 /* ;; */ 82 1.1 jtc #define IF 260 83 1.1 jtc #define THEN 261 84 1.1 jtc #define ELSE 262 85 1.1 jtc #define ELIF 263 86 1.1 jtc #define FI 264 87 1.1 jtc #define CASE 265 88 1.1 jtc #define ESAC 266 89 1.1 jtc #define FOR 267 90 1.1 jtc #define SELECT 268 91 1.1 jtc #define WHILE 269 92 1.1 jtc #define UNTIL 270 93 1.1 jtc #define DO 271 94 1.1 jtc #define DONE 272 95 1.1 jtc #define IN 273 96 1.1 jtc #define FUNCTION 274 97 1.1 jtc #define TIME 275 98 1.1 jtc #define REDIR 276 99 1.2 tls #ifdef KSH 100 1.1 jtc #define MDPAREN 277 /* (( )) */ 101 1.2 tls #endif /* KSH */ 102 1.1 jtc #define BANG 278 /* ! */ 103 1.1 jtc #define DBRACKET 279 /* [[ .. ]] */ 104 1.1 jtc #define COPROC 280 /* |& */ 105 1.1 jtc #define YYERRCODE 300 106 1.1 jtc 107 1.1 jtc /* flags to yylex */ 108 1.1 jtc #define CONTIN BIT(0) /* skip new lines to complete command */ 109 1.1 jtc #define ONEWORD BIT(1) /* single word for substitute() */ 110 1.1 jtc #define ALIAS BIT(2) /* recognize alias */ 111 1.1 jtc #define KEYWORD BIT(3) /* recognize keywords */ 112 1.1 jtc #define LETEXPR BIT(4) /* get expression inside (( )) */ 113 1.1 jtc #define VARASN BIT(5) /* check for var=word */ 114 1.1 jtc #define ARRAYVAR BIT(6) /* parse x[1 & 2] as one word */ 115 1.1 jtc #define ESACONLY BIT(7) /* only accept esac keyword */ 116 1.1 jtc #define CMDWORD BIT(8) /* parsing simple command (alias related) */ 117 1.1 jtc #define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */ 118 1.7 christos #define HEREDOC BIT(10) /* parsing heredoc */ 119 1.1 jtc 120 1.1 jtc #define HERES 10 /* max << in line */ 121 1.1 jtc 122 1.1 jtc EXTERN Source *source; /* yyparse/yylex source */ 123 1.1 jtc EXTERN YYSTYPE yylval; /* result from yylex */ 124 1.1 jtc EXTERN struct ioword *heres [HERES], **herep; 125 1.1 jtc EXTERN char ident [IDENT+1]; 126 1.1 jtc 127 1.1 jtc #ifdef HISTORY 128 1.1 jtc # define HISTORYSIZE 128 /* size of saved history */ 129 1.1 jtc 130 1.5 jdolecek EXTERN char **histlist; /* saved commands */ 131 1.1 jtc EXTERN char **histptr; /* last history item */ 132 1.1 jtc EXTERN int histsize; /* history size */ 133 1.1 jtc #endif /* HISTORY */ 134