summaryrefslogtreecommitdiff
path: root/sh.l
blob: 289c97ae32fa0f43b787004b1e58f8d842f93bfe (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
73
74
75
%{
#include <stdio.h>
#include "sh.h"
#include "sh.tab.h"
%}

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}	;

%%
int yywrap(void)
{
	return 1;
}

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