compiler

Unnamed repository; edit this file 'description' to name the repository.
git clone https://git.deepztream.com/compiler
Log | Files | Refs

lex.l (3066B)


      1 %{
      2 #include "parse.tab.h"
      3 extern int line;
      4 
      5 int is_digit(char c, int base)
      6 {
      7   if (base == 2)  return (c == '0' && c == '1');
      8   if (base == 8)  return (c >= '0' && c <= '7');
      9   if (base == 10) return (c >= '0' && c <= '9');
     10   if (base == 16) {
     11     return (c >= '0' && c <= '9' || (c | 32) >= 'a' && (c | 32) <= 'z');
     12   }
     13 }
     14 
     15 long to_long(char *str)
     16 {
     17   long r = 0;
     18   int i;
     19   int base = 10;
     20   int len;
     21   if      (*str == '0' && str[1] == 'b') base = 2,  str += 2;
     22   else if (*str == '0' && str[1] == 'o') base = 8,  str += 2;
     23   else if (*str == '0' && str[1] == 'x') base = 16, str += 2;
     24   for (len = 0; is_digit(str[len], base); len++);
     25   for (i = 0; i < len; i++)  {
     26     r *= base;
     27     switch (base) {
     28       case 2: case 8: case 10:
     29         r += str[i] - '0';
     30         break;
     31       case 16:
     32         if (str[i] >= '0' && str[i] <= '9')
     33           r += str[i] - '0';
     34         else
     35           r += (str[i] & ~(1 << 5)) - 'A' + 10;
     36         break;
     37     }
     38   }
     39   return r;
     40 }
     41 %}
     42 
     43 %%
     44 "return"                {return RETURN;}
     45 "if"                    {return IF;}
     46 "else"                  {return ELSE;}
     47 "while"                 {return WHILE;}
     48 "decl"                  {return DECL;}
     49 "exit"                  {return EXIT;}
     50 "putc"                  {return PUTC;}
     51 "write"                 {return WRITE;}
     52 "read"                  {return READ;}
     53 "brk"                   {return BRK;}
     54 "_syscall1"             {return SYSCALL1;}
     55 "_syscall2"             {return SYSCALL2;}
     56 "_syscall3"             {return SYSCALL3;}
     57 "_syscall4"             {return SYSCALL4;}
     58 "_syscall5"             {return SYSCALL5;}
     59 "_syscall6"             {return SYSCALL6;}
     60 
     61 "++"  {return INC;}
     62 "--"  {return DEC;}
     63 "+="  {return ADD_EQ;}
     64 "-="  {return SUB_EQ;}
     65 "*="  {return MUL_EQ;}
     66 "/="  {return DIV_EQ;}
     67 "%="  {return MOD_EQ;}
     68 "&="  {return AND_EQ;}
     69 "|="  {return OR_EQ;}
     70 "^="  {return XOR_EQ;}
     71 "<<="  {return SHL_EQ;}
     72 ">>="  {return SHR_EQ;}
     73 "=="  {return EQ;}
     74 "!="  {return NOT_EQ;}
     75 "<="  {return GTEQ;}
     76 ">="  {return LTEQ;}
     77 "&&"  {return AND;}
     78 "||"  {return OR;}
     79 "<<"  {return SHIFT_L;}
     80 ">>"  {return SHIFT_R;}
     81 
     82 0x[0-9a-zA-Z.]+         {yylval.i = to_long(yytext); return NUMBER;}
     83 [0-9.]+                 {yylval.i = atol(yytext); return NUMBER;}
     84 [a-zA-Z_][a-zA-Z0-9_]*  {yylval.str = calloc(strlen(yytext)+1, 1); strcpy(yylval.str, yytext); return IDENTIFIER;}
     85 \"[^\"]*\"              {yytext[strlen(yytext) - 1] = 0; yylval.str = calloc(strlen(yytext), 1); strcpy(yylval.str, yytext+1); return STRING;}
     86 '.'                     {yylval.i = yytext[1]; return NUMBER;}
     87 '\\0'                   {yylval.i = '\0'; return NUMBER;}
     88 '\\t'                   {yylval.i = '\t'; return NUMBER;}
     89 '\\n'                   {yylval.i = '\n'; return NUMBER;}
     90 '\\r'                   {yylval.i = '\r'; return NUMBER;}
     91 '\\\''                  {yylval.i = '\''; return NUMBER;}
     92 [ \t]+                  {;}
     93 "\r\n"                  {line++;}
     94 [\r\n]                  {line++;}
     95 \/\/[^\n]*                {;}
     96 [/][*].*[*][/]                {;}
     97 .                       {return *yytext;}
     98 %%
     99 /*
    100 .                       {return *yytext;}
    101 %%
    102 */