aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.c
blob: ba0e8e17b2a483c5dc03869c971c5d5b5600414a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>

#include "include/lexer.h" 
#include "include/syntax.h"
#include "include/token.h"

lexer_t* lexer_init(char* src) {
   lexer_t* lexer;

   lexer = emalloc(sizeof(struct LEXER_STRUC));

   lexer->src = src;
   lexer->state = LEXER_STATE_REG;
   lexer->tokenl = NULL;
   lexer->tokenl_last = NULL;
   lexer->tokenc = 0;

   return lexer;
}

void lexer_destroy(lexer_t* lexer) {
   free(lexer);
}

void lexer_add_token(lexer_t* lexer, token_t* token) {
   token_t* t;

   if (lexer->tokenl) {
      lexer->tokenl_last->nxt = token;
      lexer->tokenl_last = token;
   } else {
      lexer->tokenl = token;
      lexer->tokenl_last = token;
   }

   log_inf("token/v:%s\t/t:%d", token->val, token->type);

   lexer->tokenc ++;
}

void lexer_add_current_char(lexer_t* lexer, int type) {
   char* c;    /* get the current character as a string */
   token_t* t; /* the token to be added */

   c = ecalloc(2, sizeof(char));
   c[0] = *lexer->src;
   c[1] = '\0';

   t = token_init(type, c);

   lexer_add_token(lexer, t);
}

void lexer_do_reg(lexer_t* lexer) {
   switch (*lexer->src) {
      case SYNTAX_APPLY:
         lexer_add_current_char(lexer, TOKEN_APPLY);
         break;
      case SYNTAX_TAG_DELIM:
         lexer_add_current_char(lexer, TOKEN_TAG_DELIM);
         break;
      case SYNTAX_NAMESPACE_DELIM:
         lexer_add_current_char(lexer, TOKEN_NAMESPACE_DELIM);
         break;
      case SYNTAX_SET:
         lexer_add_current_char(lexer, TOKEN_SET);
         break;
      case SYNTAX_LLIST:
         lexer_add_current_char(lexer, TOKEN_LLIST);
         break;
      case SYNTAX_RLIST:
         lexer_add_current_char(lexer, TOKEN_RLIST);
         break;
      case SYNTAX_LGROUP:
         lexer_add_current_char(lexer, TOKEN_LGROUP);
         break;
      case SYNTAX_RGROUP:
         lexer_add_current_char(lexer, TOKEN_RGROUP);
         break;
      case SYNTAX_EXPR_END:
         lexer_add_current_char(lexer, TOKEN_EXPR_END);
         break;
      case SYNTAX_STR_DELIM:
         lexer_add_current_char(lexer, TOKEN_STR_DELIM);
         break;
      case SYNTAX_CHAR_DELIM:
         lexer_add_current_char(lexer, TOKEN_CHAR_DELIM);
         break;
      case SYNTAX_LIST_DELIM:
         lexer_add_current_char(lexer, TOKEN_LIST_DELIM);
         break;
      default:
         lexer_add_current_char(lexer, TOKEN_UNKNOWN);
   }
}

void lexer_do_chr(lexer_t* lexer) {
   if (*lexer->src == '\'') {
      lexer->state = LEXER_STATE_REG;
   } else {
      token_t* t;

      t = token_init(TOKEN_CHAR, *lexer->src);

      lexer_add_token(lexer, t);
   }
}

void lexer_do_str(lexer_t* lexer) {

}

void lexer_run(lexer_t* lexer) {
   while (*lexer->src) {
      if (lexer->state == LEXER_STATE_REG) { lexer_do_reg(lexer); }
      lexer->src ++;
   }
}