Basic addition with integers is now available.
This commit is contained in:
parent
4080d1a80a
commit
4514d94be9
78
src/ast.c
78
src/ast.c
@ -3,46 +3,12 @@
|
|||||||
#include "include/ast.h"
|
#include "include/ast.h"
|
||||||
#include "include/util.h"
|
#include "include/util.h"
|
||||||
|
|
||||||
#if 0
|
extern AST* root;
|
||||||
|
|
||||||
static char* asttype_names[] = {
|
static char* asttype_names[] = {
|
||||||
[AST_TYPE_CALL] = "CALL",
|
[AST_TYPE_CALL] = "CALL",
|
||||||
[AST_TYPE_NUM] = "NUMBER",
|
[AST_TYPE_NUM] = "NUMBER",
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
ASTTypeNum* ast_type_num_init(int val) {
|
|
||||||
talloc(ASTTypeNum, num);
|
|
||||||
|
|
||||||
num->val = val;
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ast_type_num_destroy(ASTTypeNum* num) {
|
|
||||||
if (!num)
|
|
||||||
return
|
|
||||||
|
|
||||||
free(num);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTTypeCall* ast_type_call_init(char* to, size_t argc, AST** argv) {
|
|
||||||
talloc(ASTTypeCall, call);
|
|
||||||
|
|
||||||
call->to = to;
|
|
||||||
call->argc = argc;
|
|
||||||
call->argv = argv;
|
|
||||||
|
|
||||||
return call;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ast_type_call_destroy(ASTTypeCall* call) {
|
|
||||||
if (!call)
|
|
||||||
return
|
|
||||||
|
|
||||||
free(call->to);
|
|
||||||
for (size_t i = 0; i < call->argc; i++) free(call->argv[i]);
|
|
||||||
free(call);
|
|
||||||
}
|
|
||||||
|
|
||||||
AST* ast_init(ASTType type, void* data) {
|
AST* ast_init(ASTType type, void* data) {
|
||||||
AST* ast = malloc(sizeof(AST));
|
AST* ast = malloc(sizeof(AST));
|
||||||
@ -62,3 +28,43 @@ void ast_destroy(AST* ast) {
|
|||||||
default: log_dbgf("Unknown ast type %d (max: %d)", ast->type, AST_TYPE_MAX);
|
default: log_dbgf("Unknown ast type %d (max: %d)", ast->type, AST_TYPE_MAX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ast_print(AST* ast) {
|
||||||
|
log_dbgf("Tree type: %s", asttype_names[ast->type]);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ASTNumData* ast_type_num_init(int val) {
|
||||||
|
talloc(ASTNumData, num);
|
||||||
|
|
||||||
|
num->val = val;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ast_type_num_destroy(ASTNumData* num) {
|
||||||
|
if (!num)
|
||||||
|
return
|
||||||
|
|
||||||
|
free(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTCallData* ast_type_call_init(char* to, size_t argc, AST** argv) {
|
||||||
|
talloc(ASTCallData, call);
|
||||||
|
|
||||||
|
call->to = to;
|
||||||
|
call->argc = argc;
|
||||||
|
call->argv = argv;
|
||||||
|
|
||||||
|
return call;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ast_type_call_destroy(ASTCallData* call) {
|
||||||
|
if (!call)
|
||||||
|
return
|
||||||
|
|
||||||
|
free(call->to);
|
||||||
|
for (size_t i = 0; i < call->argc; i++) free(call->argv[i]);
|
||||||
|
free(call);
|
||||||
|
}
|
||||||
|
21
src/exec.c
21
src/exec.c
@ -5,26 +5,27 @@
|
|||||||
#include "include/exec.h"
|
#include "include/exec.h"
|
||||||
#include "include/util.h"
|
#include "include/util.h"
|
||||||
|
|
||||||
void exec(AST* ast) {
|
extern AST* root;
|
||||||
|
|
||||||
|
void exec_expr() {
|
||||||
|
ast_print(root);
|
||||||
log_dbg("Started execution.");
|
log_dbg("Started execution.");
|
||||||
switch (ast->type) {
|
switch (root->type) {
|
||||||
case AST_TYPE_CALL: exec_call(ast); break;
|
case AST_TYPE_CALL: exec_call(); break;
|
||||||
default: printf("what\n");
|
default: printf("what\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void exec_call(AST* ast) {
|
void exec_call() {
|
||||||
log_dbg("Started call execution.");
|
log_dbg("Started call execution.");
|
||||||
ASTTypeCall* calldata = (ASTTypeCall*)ast->data;
|
fflush(stdout);
|
||||||
|
ASTCallData* calldata = (ASTCallData*)root->data;
|
||||||
if (!strcmp(calldata->to, "+") && calldata->argc == 2) {
|
if (!strcmp(calldata->to, "+") && calldata->argc == 2) {
|
||||||
|
|
||||||
exec_return(1);
|
ASTNumData* n1 = (ASTNumData*)calldata->argv[0]->data;
|
||||||
/*
|
ASTNumData* n2 = (ASTNumData*)calldata->argv[1]->data;
|
||||||
ASTTypeNum* n1 = (ASTTypeNum*)calldata->argv[0]->data;
|
|
||||||
ASTTypeNum* n2 = (ASTTypeNum*)calldata->argv[1]->data;
|
|
||||||
|
|
||||||
exec_return(n1->val + n2->val);
|
exec_return(n1->val + n2->val);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,19 +24,14 @@
|
|||||||
%token<intval> NUM
|
%token<intval> NUM
|
||||||
%token<strval> CALL
|
%token<strval> CALL
|
||||||
%token PLUS
|
%token PLUS
|
||||||
|
%token NL
|
||||||
%type<ast> exp
|
%type<ast> exp
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
input:
|
input:
|
||||||
%empty
|
%empty
|
||||||
| line
|
| exp { root = $1; }
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
line:
|
|
||||||
'\n'
|
|
||||||
| exp '\n' { root = $1; }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
exp:
|
exp:
|
||||||
@ -44,7 +39,7 @@ exp:
|
|||||||
| NUM PLUS NUM {
|
| NUM PLUS NUM {
|
||||||
AST* argv[2] = {
|
AST* argv[2] = {
|
||||||
ast_init(AST_TYPE_NUM, ast_type_num_init($1)),
|
ast_init(AST_TYPE_NUM, ast_type_num_init($1)),
|
||||||
ast_init(AST_TYPE_NUM, ast_type_num_init($1))
|
ast_init(AST_TYPE_NUM, ast_type_num_init($3))
|
||||||
};
|
};
|
||||||
$$ = ast_init(AST_TYPE_CALL, ast_type_call_init("+", 2, argv));
|
$$ = ast_init(AST_TYPE_CALL, ast_type_call_init("+", 2, argv));
|
||||||
};
|
};
|
||||||
|
@ -16,21 +16,22 @@ typedef struct {
|
|||||||
|
|
||||||
AST* ast_init(ASTType type, void* data);
|
AST* ast_init(ASTType type, void* data);
|
||||||
void ast_destroy(AST* ast);
|
void ast_destroy(AST* ast);
|
||||||
|
void ast_print(AST* ast);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int val;
|
int val;
|
||||||
} ASTTypeNum;
|
} ASTNumData;
|
||||||
|
|
||||||
ASTTypeNum* ast_type_num_init(int val);
|
ASTNumData* ast_type_num_init(int val);
|
||||||
void ast_type_num_destroy(ASTTypeNum* num);
|
void ast_type_num_destroy(ASTNumData* num);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* to; // What the call's to.
|
char* to; // What the call's to.
|
||||||
size_t argc; // Argument count.
|
size_t argc; // Argument count.
|
||||||
AST** argv; // Argument vector.
|
AST** argv; // Argument vector.
|
||||||
} ASTTypeCall;
|
} ASTCallData;
|
||||||
|
|
||||||
ASTTypeCall* ast_type_call_init(char* to, size_t argc, AST** argv);
|
ASTCallData* ast_type_call_init(char* to, size_t argc, AST** argv);
|
||||||
void ast_type_call_destroy(ASTTypeCall* call);
|
void ast_type_call_destroy(ASTCallData* call);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#ifndef EXEC_H
|
#ifndef EXEC_H
|
||||||
#define EXEC_H
|
#define EXEC_H
|
||||||
|
|
||||||
#include "ast.h"
|
void exec_expr();
|
||||||
|
void exec_call();
|
||||||
void exec(AST* ast);
|
|
||||||
void exec_call(AST* ast);
|
|
||||||
void exec_return(int n);
|
void exec_return(int n);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,6 +26,7 @@ int yylex() {
|
|||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '+': return PLUS;
|
case '+': return PLUS;
|
||||||
|
case '\n': return NL;
|
||||||
default: return CALL;
|
default: return CALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
38
src/main.c
38
src/main.c
@ -4,6 +4,7 @@
|
|||||||
#include "include/dstr.h"
|
#include "include/dstr.h"
|
||||||
#include "include/lexer.h"
|
#include "include/lexer.h"
|
||||||
#include "include/util.h"
|
#include "include/util.h"
|
||||||
|
#include "include/exec.h"
|
||||||
|
|
||||||
#include "../build/grammars/grammar.tab.h"
|
#include "../build/grammars/grammar.tab.h"
|
||||||
|
|
||||||
@ -16,28 +17,41 @@ char* inp = NULL;
|
|||||||
extern int yyparse();
|
extern int yyparse();
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
Dstr* cline = dstr_init(); // The current line.
|
Dstr* ln = dstr_init();
|
||||||
|
char c;
|
||||||
|
|
||||||
printf("> ");
|
printf("> ");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
for (char cch; (cch = getc(stdin)) != '\n';) {
|
|
||||||
log_dbgf("cchar: %c", cch);
|
// Accumulate line.
|
||||||
dstr_appendch(cline, cch);
|
do {
|
||||||
|
c = getc(stdin);
|
||||||
|
switch (c) {
|
||||||
|
case EOF: dstr_destroy(ln); goto lnskip;
|
||||||
|
case '\n': goto lnend;
|
||||||
|
|
||||||
|
default: dstr_appendch(ln, c); log_dbgf("cchar: %c", c);
|
||||||
}
|
}
|
||||||
dstr_appendch(cline, '\n');
|
} while (1);
|
||||||
|
|
||||||
log_dbgf("cline: %s", cline->buf);
|
lnend:
|
||||||
|
|
||||||
if (cline->ln > 0) {
|
log_dbgf("cline: %s", ln->buf);
|
||||||
|
|
||||||
|
if (ln->ln > 0) {
|
||||||
// I hope it's null-terminated.
|
// I hope it's null-terminated.
|
||||||
inp = cline->buf;
|
inp = ln->buf;
|
||||||
if (yyparse() == 0) {
|
if (yyparse() == 0)
|
||||||
printf("Parsed successfully!\n");
|
printf("Parsed successfully!\n");
|
||||||
} else {
|
else
|
||||||
printf("Parse error.\n");
|
printf("Parse error.\n");
|
||||||
}
|
|
||||||
|
exec_expr();
|
||||||
}
|
}
|
||||||
|
|
||||||
dstr_destroy(cline);
|
dstr_destroy(ln);
|
||||||
}
|
}
|
||||||
|
lnskip:;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user