} AST;
/* String */
-AST* String(Tok* val);
+AST* String(char* val);
char* string_value(AST* val);
/* Character */
-AST* Char(Tok* val);
+AST* Char(int val);
uint32_t char_value(AST* val);
/* Integer */
-AST* Integer(Tok* val);
+AST* Integer(int val);
intptr_t integer_value(AST* val);
/* Float */
-AST* Float(Tok* val);
+AST* Float(double val);
double float_value(AST* val);
/* Bool */
-AST* Bool(Tok* val);
+AST* Bool(bool val);
bool bool_value(AST* val);
/* Ident */
-AST* Ident(Tok* val);
+AST* Ident(char* val);
char* ident_value(AST* val);
/* Definition */
return tree;
}
-AST* String(Tok* val) {
+AST* String(char* val) {
AST* node = ast(AST_STRING);
- node->value.text = val->text;
+ node->value.text = val;
return node;
}
return val->value.text;
}
-AST* Char(Tok* val) {
+AST* Char(int val) {
AST* node = ast(AST_CHAR);
- node->value.integer = val->value.integer;
+ node->value.integer = val;
return node;
}
return val->value.integer;
}
-AST* Integer(Tok* val) {
+AST* Integer(int val) {
AST* node = ast(AST_INT);
- node->value.integer = val->value.integer;
+ node->value.integer = val;
return node;
}
return val->value.integer;
}
-AST* Float(Tok* val) {
+AST* Float(double val) {
AST* node = ast(AST_FLOAT);
- node->value.floating = val->value.floating;
+ node->value.floating = val;
return node;
}
return val->value.floating;
}
-AST* Bool(Tok* val) {
+AST* Bool(bool val) {
AST* node = ast(AST_BOOL);
- node->value.integer = val->value.integer;
+ node->value.integer = val;
return node;
}
return val->value.integer;
}
-AST* Ident(Tok* val) {
+AST* Ident(char* val) {
AST* node = ast(AST_IDENT);
- node->value.text = val->text;
+ node->value.text = strdup(val);
return node;
}
AST* tree = NULL;
Tok* tok = peek(p);
switch (tok->type) {
- case T_BOOL: tree = Bool(tok); break;
- case T_CHAR: tree = Char(tok); break;
- case T_STRING: tree = String(tok); break;
- case T_INT: tree = Integer(tok); break;
- case T_FLOAT: tree = Float(tok); break;
- case T_ID: tree = Ident(tok); break;
+ case T_BOOL: tree = Bool(tok->value.integer); break;
+ case T_CHAR: tree = Char(tok->value.integer); break;
+ case T_STRING: tree = String(tok->text); break;
+ case T_INT: tree = Integer(tok->value.integer); break;
+ case T_FLOAT: tree = Float(tok->value.floating); break;
+ case T_ID: tree = Ident(tok->text); break;
default: error(p, "expected an expression");
}
accept(p, tok->type);
static AST* identifier(Parser* p) {
Tok* tok = peek(p);
if (tok->type == T_ID) {
- AST* ast = Ident(tok);
+ AST* ast = Ident(tok->text);
tok->type = T_NONE;
return ast;
} else {
Parser TestCtx = {0};
+
+static int astcmp(AST* a, AST* b) {
+ int result = a->nodetype - b->nodetype;
+ if (result) return result;
+ switch (a->nodetype) {
+ case AST_BOOL:
+ case AST_CHAR:
+ case AST_INT:
+ return (a->value.integer - b->value.integer);
+ }
+}
+
void lex_string(Parser* ctx, char* text) {
LexFile* file = calloc(sizeof(LexFile), 1u);
file->path = NULL;
codegen_init(&TestCtx);
lex_string(&TestCtx, text);
AST* result = expression(&TestCtx);
- return 1;
+ int cmpresult = astcmp(expect, result);
+ return cmpresult;
}
TEST_SUITE(ParserTests) {
TEST(should parse some stuff) {
- CHECK(parse("123", NULL));
+ CHECK(!parse("123", Integer(123)));
}
}