changeset 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 86c0a38332fe
children
files analyser/lexer.c
diffstat 1 files changed, 132 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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 <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;
+}