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 */