aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-08 18:26:03 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-08 18:26:03 +0100
commita6df057d6a0556dab601b0b45bb6469570abba01 (patch)
tree961cdc7b4f39b2754fb880043eee0a681bcf9281 /src
parentwhoops (diff)
downloadmds-a6df057d6a0556dab601b0b45bb6469570abba01.tar.gz
mds-a6df057d6a0556dab601b0b45bb6469570abba01.tar.bz2
mds-a6df057d6a0556dab601b0b45bb6469570abba01.tar.xz
beginning on lexal parsing
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r--src/mds-kbdc/mds-kbdc.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mds-kbdc/mds-kbdc.c b/src/mds-kbdc/mds-kbdc.c
index 608d0b4..24e4dda 100644
--- a/src/mds-kbdc/mds-kbdc.c
+++ b/src/mds-kbdc/mds-kbdc.c
@@ -23,7 +23,9 @@
#include <libmdsserver/macros.h>
#include <stdio.h>
+#include <unistd.h>
#include <errno.h>
+#include <string.h>
@@ -38,13 +40,85 @@ int main(int argc_, char** argv_)
{
const char* pathname = argv_[1];
source_code_t source_code;
+ size_t i, n;
argc = argc_;
argv = argv_;
source_code_initialise(&source_code);
fail_if (read_source_lines(pathname, &source_code) < 0);
+ /* TODO '\t':s should be expanded into ' ':s. */
+ for (i = 0, n = source_code.line_count; i < n; i++)
+ {
+ char* line = source_code.lines[i];
+ char* end;
+ char prev_end_char;
+
+ while (*line && (*line == ' '))
+ line++;
+ end = strchrnul(line, ' ');
+ if (end == line)
+ continue;
+ prev_end_char = *end;
+ *end = '\0';
+
+ if (!strcmp(line, "information"))
+ ;
+ else if (!strcmp(line, "language"))
+ ;
+ else if (!strcmp(line, "country"))
+ ;
+ else if (!strcmp(line, "variant"))
+ ;
+ else if (!strcmp(line, "include"))
+ ;
+ else if (!strcmp(line, "function"))
+ ;
+ else if (!strcmp(line, "macro"))
+ ;
+ else if (!strcmp(line, "assumption"))
+ ;
+ else if (!strcmp(line, "if"))
+ ;
+ else if (!strcmp(line, "else"))
+ ;
+ else if (!strcmp(line, "for"))
+ ;
+ else if (!strcmp(line, "end"))
+ ;
+ else if (!strcmp(line, "return"))
+ ;
+ else if (!strcmp(line, "continue"))
+ ;
+ else if (!strcmp(line, "break"))
+ ;
+ else if (!strcmp(line, "let"))
+ ;
+ else if (!strcmp(line, "have"))
+ ;
+ else if (!strcmp(line, "have_chars"))
+ ;
+ else if (!strcmp(line, "have_range"))
+ ;
+ else if ((*line != '"') && (*line != '<') && (strchr(line, '(') == NULL))
+ {
+ size_t j, m1, m2;
+ m1 = (size_t)(line - source_code.lines[i]);
+ m2 = (size_t)(end - source_code.lines[i]);
+ fprintf(stderr, "\033[1m%s:%zu:%zu-%zu: \033[31merror:\033[0m invalid keyword \033[1m‘%s’\033[0m\n",
+ pathname, i + 1, m1 + 1, m2 + 1 /* TODO measure chars, not bytes */, line);
+ fprintf(stderr, " %s\n \033[1;32m", source_code.real_lines[i]);
+ for (j = 0; j < m1; j++)
+ fputc(' ', stderr);
+ for (; j < m2; j++)
+ if ((source_code.lines[i][j] & 0xC0) != 0x80)
+ fputc('^', stderr);
+ fprintf(stderr, "\033[0m\n");
+ }
+
+ *end = prev_end_char;
+ }
/*
information