Mercurial > hg > Members > nobuyasu > myCompiler
view analyser/lexer.c @ 7:23b18b61c35f draft default tip
analyser
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 05 Feb 2013 07:36:02 +0900 |
parents | |
children |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #define IS_NUM(c) ('0' <= c && c <= '9') #define IS_ALPHA(c) ('a' <= c && c <='z') || ('A' <= c && c <= 'Z') enum { Y_ERROR = -1, Y_EOF, Y_NUM = 1, Y_STRING, Y_SYMBOL, Y_PLUS, Y_MINUS, Y_TIMES, Y_DIV, Y_TOKEN, Y_SPACE }; typedef struct token TOKEN; struct token { char *buffer; char *str; int value; }; TOKEN *tok; char *get_new_str(char *start, char *end) { int len = end - start; char *str = malloc(len * sizeof(char)); memcpy(str, start, len * sizeof(char)); return str; } int get_token(char *cur) { int c = (int)*tok->buffer; while (c != EOF) { int p = _get_token(c); tok->buffer++; c = (int)*tok->buffer; return p; } return 0; } int _get_token() { int c = (int)*tok->buffer; switch (c) { case '+': return Y_PLUS; case '-': return Y_MINUS; case '*': return Y_TIMES; case '/': return Y_DIV; case '"': return get_string(); case ' ' || '\r': return Y_SPACE; case EOF: return Y_EOF; default: break; } if (IS_NUM(c)) { tok->value = 0; while (IS_NUM(c)) { tok->value = tok->value * 10; tok->value += c - '0'; tok->buffer++; c = (int)*tok->buffer; } return Y_NUM; } if (IS_ALPHA(c)) { char *start = tok->buffer; while (IS_ALPHA(c)) { tok->buffer++; c = (int)*tok->buffer; } char *end = tok->buffer; tok->str = get_new_str(start, end); return Y_TOKEN; } return 0; } int main(int argc, char *argv[]) { char text[] = "a+b 123 a23 333 ccc"; char *cur = text; printf("sizeof(cur) = %d\n", sizeof(cur)/sizeof(char)); tok = malloc(sizeof(TOKEN)); tok->buffer = text; tok->str = text; tok->value = 0; int i = 0; while (*cur != '\0') { int c = get_token(cur); cur++; switch(c) { case Y_PLUS: puts("Y_PLUS"); break; case Y_MINUS: puts("Y_MINUS"); break; case Y_TIMES: puts("Y_TIMES"); break; case Y_DIV: puts("Y_DIV"); break; case Y_NUM: puts("Y_NUM"); printf("value : %d\n", tok->value ); break; case Y_STRING: puts("Y_STRING"); break; case Y_TOKEN: puts("Y_TOKEN"); printf("token : %s\n",tok->str); break; default: break; } } free(tok); return 0; }