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;
}