summaryrefslogtreecommitdiff
path: root/sh.l
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-13 21:47:51 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-13 21:47:51 -0400
commita088e851fb45fe38e6a228770fa5d0c04cddb7f5 (patch)
treeccec5f171001fde3ad8d18b8241a8c1f441a77fc /sh.l
migrate to gitlab
Diffstat (limited to 'sh.l')
-rw-r--r--sh.l65
1 files changed, 65 insertions, 0 deletions
diff --git a/sh.l b/sh.l
new file mode 100644
index 0000000..539a251
--- /dev/null
+++ b/sh.l
@@ -0,0 +1,65 @@
+%{
+#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} ;