aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.l')
-rw-r--r--src/lexer.l47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/lexer.l b/src/lexer.l
new file mode 100644
index 0000000..c9aaff0
--- /dev/null
+++ b/src/lexer.l
@@ -0,0 +1,47 @@
+%option noyywrap yylineno
+
+%{
+#include "parser.tab.h"
+%}
+
+DIGIT [0-9]
+IDENT [A-Za-z][A-Za-z0-9]*
+WHITESPACE [ \t\r\n]+
+
+%%
+
+"skip" { return TOKEN_SKIP; }
+"if" { return TOKEN_IF; }
+"then" { return TOKEN_THEN; }
+"else" { return TOKEN_ELSE; }
+"end" { return TOKEN_END; }
+"while" { return TOKEN_WHILE; }
+"do" { return TOKEN_DO; }
+
+"(" { return TOKEN_LEFT_PARENTHESIS; }
+")" { return TOKEN_RIGHT_PARENTHESIS; }
+";" { return TOKEN_SEMICOLON; }
+":=" { return TOKEN_ASSIGN; }
+
+"+" { return TOKEN_PLUS; }
+"-" { return TOKEN_MINUS; }
+"*" { return TOKEN_MULTIPLY; }
+
+"or" { return TOKEN_OR; }
+"and" { return TOKEN_AND; }
+"not" { return TOKEN_NOT; }
+
+"=" { return TOKEN_EQUALS; }
+"#" { return TOKEN_NOT_EQUALS; }
+"<=" { return TOKEN_LESS_EQUAL; }
+"<" { return TOKEN_LESS_THAN; }
+">=" { return TOKEN_GREATER_EQUAL; }
+">" { return TOKEN_GREATER_THAN; }
+
+{DIGIT}+ { yylval.num = atoi(yytext); return TOKEN_NUMERAL; }
+{IDENT} { yylval.id = strdup(yytext); return TOKEN_IDENTIFIER; }
+
+{WHITESPACE} { }
+. { fprintf(stderr, "Unknown char: %s\n", yytext); }
+
+%%