summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/main.felan1
-rw-r--r--src/compiler/parser.c57
2 files changed, 51 insertions, 7 deletions
diff --git a/code/main.felan b/code/main.felan
index 70c08da..032cfc8 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -20,4 +20,5 @@ usize :: u64;
main :: () -> void {
a := 'a';
putc a;
+ putc '\n';
};
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 78dc18f..0146650 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -943,8 +943,7 @@ ParserNode *parserNoMetadata(LexerNode *node, ParserNode *parent,
newParserNode(token, node->str_begin, node->str_end, NULL, parent);
}
-ParserNode *parserPutc(LexerNode *node, LexerNode *end,
- ParserNode *parent) {
+ParserNode *parserPutc(LexerNode *node, LexerNode *end, ParserNode *parent) {
LexerNode *afterNode = node + 1;
if (afterNode >= end) {
printError(node->str_begin, node->str_end, "No param");
@@ -1027,14 +1026,58 @@ ParserNode *parserNumber(LexerNode *node, ParserNode *parent) {
ParserNode *parserChar(LexerNode *node, ParserNode *parent) {
const size_t size = node->str_end - 1 - node->str_begin - 1;
ParserNodeCharMetadata *metadata = a404m_malloc(sizeof(*metadata));
- if (size == 1) {
- *metadata = *(node->str_begin + 1);
- } else if (size > 1) {
- NOT_IMPLEMENTED;
- } else {
+ char c = node->str_begin[1];
+ if (size == 0) {
printError(node->str_begin, node->str_end,
"Bad character: Character can't be empty");
+ return NULL;
+ } else if (size == 1) {
+ // knowingly left empty
+ } else if (size == 2 && c == '\\') {
+ c = node->str_begin[2];
+ switch (c) {
+ case 'a':
+ c = '\a';
+ break;
+ case 'b':
+ c = '\b';
+ break;
+ case 'e':
+ c = '\e';
+ break;
+ case 'f':
+ c = '\f';
+ break;
+ case 'n':
+ c = '\n';
+ break;
+ case 'r':
+ c = '\r';
+ break;
+ case 't':
+ c = '\t';
+ break;
+ case 'v':
+ c = '\v';
+ break;
+ case '\\':
+ c = '\\';
+ break;
+ case '\'':
+ c = '\'';
+ break;
+ case '"':
+ c = '\"';
+ break;
+ default:
+ printError(node->str_begin, node->str_end, "Bad escape character");
+ return NULL;
+ }
+ } else {
+ printError(node->str_begin, node->str_end, "Bad character");
+ return NULL;
}
+ *metadata = c;
return node->parserNode =
newParserNode(PARSER_TOKEN_VALUE_CHAR, node->str_begin,
node->str_end, metadata, parent);