# HG changeset patch # User Nobuyasu Oshiro # Date 1360017362 -32400 # Node ID 23b18b61c35f6eb1f4161b63939b6b578e02abd1 # Parent 86c0a38332fe9a57eb432a02d6f561066fdfd24b analyser diff -r 86c0a38332fe -r 23b18b61c35f analyser/lexer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/analyser/lexer.c Tue Feb 05 07:36:02 2013 +0900 @@ -0,0 +1,132 @@ +#include +#include +#include + +#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; +}