summaryrefslogtreecommitdiff
path: root/lex.l
blob: 64c3765c047579306700e43632ea4b5d84c97917 (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
%{
#include "ast.h"
#include "grammar.tab.h"
%}

%%
"+"                     { return OPERATOR_PLUS; }
"-"                     { return OPERATOR_MINUS; }
"="                     { return ASSIGN; }

"function"              { return FUNCTION; }
"if"                    { return IF; }
"else"                  { return ELSE; }
"return"                { return RETURN; }
"const"                 { return CONST; }
"var"                   { return VAR; }

"integer"               { return TYPE_INTEGER; }
"string"                { return TYPE_STRING; }
"void"                  { return TYPE_VOID; }

"("                     { return PARENTHESIS_LEFT; }
")"                     { return PARENTHESIS_RIGHT; }
"{"                     { return BRACE_LEFT; }
"}"                     { return BRACE_RIGHT; }
"["                     { return BRACKET_LEFT; }
"]"                     { return BRACKET_RIGHT; }

","                     { return COMMA; }
":"                     { return COLON; }

[a-zA-Z][a-zA-Z0-9]*    { yylval.string = yytext; return IDENTIFIER; }
[0-9]+                  { yylval.number = atoi(yytext); return NUMBER; }
"//".*                  { return COMMENT; }

\n                      { return END_OF_LINE; }
[ \t]                   {}

.                       { printf("undefined: %c\n", *yytext); }
%%

void henshin_lex(int argc, char **argv)
{
  int tok;

  while (tok = yylex()) {
    printf("%d", tok);
    if (tok == NUMBER) {
      printf(" = %d", yylval);
    }
    printf("\n");
  }
}