summaryrefslogtreecommitdiff
path: root/src/frontend/lexer.l
blob: 40f619608b8d984f5291de5e19ee0fc5c8cfc957 (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
/*** definition section ***/
%{
  /* C to be copied verbatim */
  #include "parser.h"
%}

/* read only one input file */
%option noyywrap
%option yylineno

DIGIT    [0-9]
PREID    [a-zA-Z_]
PSTID    [a-zA-Z0-9_]

/*** rules section ***/
%%

"("             {return L_PAREN;}
")"             {return R_PAREN;}
"{"             {return L_BRACK;}
"}"             {return R_BRACK;}
";"             {return SEMI_COL;}
"~"             {return COMP;}
"*"             {return MULT;}
"/"             {return DIV;}
"%"             {return MOD;}
"-"             {return MINUS;}
"+"             {return PLUS;}

"int"           {return INT;}
"void"          {return VOID;}
"return"        {return RET;}

{PREID}{PSTID}* {
  yylval.sval = strdup(yytext);
  return WORD;
       }

{DIGIT}+        {yylval.ival = atol(yytext); return NUMBER;}

{PSTID}+ {
  printf("Error at line %d: invalid identifier \"%s\"\n", yylineno, yytext);
  return YYerror;
}

[[:space:]]+    {/* discard */}
.               {
  printf("Error at line %d: unrecognized symbol \"%s\"\n", yylineno, yytext);
  return YYerror;
}

%%

/*** C section ***/