summaryrefslogtreecommitdiff
path: root/sh.l
blob: c38ea7c47217dfd0334b4ea0dd67f6079f02377b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
%{
#include "sh.h"
#include "sh.tab.h"
/* thanks, flex, for implicitly declaring identifiers */
/* bonus points for something that isn't part of ISO C */
extern int fileno(FILE *);
%}

NAME [_a-zA-Z0-9]
NONDIGIT [_a-zA-Z]
DIGIT [0-9]
WHITESPACE [ \t]
OPERATOR [()|;&<>]

%s FOR
%x COMMENT

%%

"#"		{ BEGIN COMMENT; }
<COMMENT>.	;
<COMMENT>\n	{ BEGIN INITIAL; }

"&&"/.	{ return AND_IF; }
"||"/.	{ return OR_IF; }
";;"/.	{ return DSEMI; }
"<<"/.	{ return DLESS; }
">>"/.	{ return DGREAT; }
"<&"/.	{ return LESSAND; }
">&"/.	{ return GREATAND; }
"<>"/.	{ return LESSGREAT; }
"<<-"/.	{ return DLESSDASH; }
">|"/.	{ return CLOBBER; }

"if"	{ return If; }
"then"	{ return Then; }
"else"	{ return Else; }
"elif"	{ return Elif; }
"fi"	{ return Fi; }
"do"	{ return Do; }
"done"	{ BEGIN INITIAL; return Done; }
"case"	{ return Case; }
"esac"	{ return Esac; }
"while"	{ return While; }
"until"	{ return Until; }
"for"	{ BEGIN FOR; return For; }

"{"	{ return Lbrace; }
"}"	{ return Rbrace; }
"!"	{ return Bang; }

"in"	{ return In; }

{OPERATOR}/.	{ return yytext[0]; }

{DIGIT}+/<	{ yylval.n = atoi(yytext); return IO_NUMBER; }
{DIGIT}+/>	{ yylval.n = atoi(yytext); return IO_NUMBER; }

\n		{ return NEWLINE; }

<FOR>{NONDIGIT}{NAME}*	{ yylval.s = yytext; return NAME; }

[^ \t\n()|;&<>]+	{ yylval.s = yytext; return WORD; }

{WHITESPACE}	;

%%
void sh_silence_warning(void)
{
	input();
	yyunput(0, 0);
}