{
lex_tok_t* p_tok = NULL;
switch (p_tok_ast->contents[0]) {
- case '(': p_tok = lex_tok_new(LPAR, NULL); break;
- case ')': p_tok = lex_tok_new(RPAR, NULL); break;
- case '{': p_tok = lex_tok_new(LBRACE, NULL); break;
- case '}': p_tok = lex_tok_new(RBRACE, NULL); break;
- case '[': p_tok = lex_tok_new(LBRACK, NULL); break;
- case ']': p_tok = lex_tok_new(RBRACK, NULL); break;
- case ';': p_tok = lex_tok_new(END, NULL); break;
- case ',': p_tok = lex_tok_new(COMMA, NULL); break;
+ case '(': p_tok = lex_tok_new(T_LPAR, NULL); break;
+ case ')': p_tok = lex_tok_new(T_RPAR, NULL); break;
+ case '{': p_tok = lex_tok_new(T_LBRACE, NULL); break;
+ case '}': p_tok = lex_tok_new(T_RBRACE, NULL); break;
+ case '[': p_tok = lex_tok_new(T_LBRACK, NULL); break;
+ case ']': p_tok = lex_tok_new(T_RBRACK, NULL); break;
+ case ';': p_tok = lex_tok_new(T_END, NULL); break;
+ case ',': p_tok = lex_tok_new(T_COMMA, NULL); break;
}
return p_tok;
}
errno = 0;
*p_int = strtol(p_tok_ast->contents, NULL, base);
assert(errno == 0);
- return lex_tok_new(INT, p_int);
+ return lex_tok_new(T_INT, p_int);
}
lex_tok_t* lexer_float(mpc_ast_t* p_tok_ast)
errno = 0;
*p_dbl = strtod(p_tok_ast->contents, NULL);
assert(errno == 0);
- return lex_tok_new(FLOAT, p_dbl);
+ return lex_tok_new(T_FLOAT, p_dbl);
}
lex_tok_t* lexer_char(mpc_ast_t* p_tok_ast)
"\v\0vtab"
};
if (strlen(p_tok_ast->contents) == 1) {
- p_tok = lex_tok_new(CHAR, (void*)(p_tok_ast->contents[0]));
+ p_tok = lex_tok_new(T_CHAR, (void*)(p_tok_ast->contents[0]));
} else {
for(int i = 0; i < 5; i++) {
if (strcmp(p_tok_ast->contents, &(lookup_table[i][2]))) {
- p_tok = lex_tok_new(CHAR, (void*)(lookup_table[i][0]));
+ p_tok = lex_tok_new(T_CHAR, (void*)(lookup_table[i][0]));
break;
}
}
lex_tok_t* lexer_bool(mpc_ast_t* p_tok_ast)
{
- return lex_tok_new(BOOL, (void*)((0==strcmp(p_tok_ast->contents,"True")) ? true : false));
+ return lex_tok_new(T_BOOL, (void*)((0==strcmp(p_tok_ast->contents,"True")) ? true : false));
}
lex_tok_t* lexer_var(mpc_ast_t* p_tok_ast)
{
char* p_str = lexer_dup(p_tok_ast->contents);
- return lex_tok_new(VAR, p_str);
+ return lex_tok_new(T_VAR, p_str);
}
lex_tok_t* lex_tok_new(lex_tok_type_t type, void* val) {
#include "mpc.h"
#include "scanner.h"
#include "lexer.h"
+#include "opts.h"
#include <stdio.h>
/*****************************************************************************/
lex_tok_t* p_tok;
} parser_t;
-lex_tok_t tok_eof = { END_FILE, NULL, 0, 0, NULL };
+lex_tok_t tok_eof = { T_END_FILE, NULL, 0, 0, NULL };
parser_t* parser_new(char* p_prompt, FILE* input)
{
}
bool parser_eof(parser_t* p_parser) {
- return (parser_peek(p_parser)->type == END_FILE);
+ return (parser_peek(p_parser)->type == T_END_FILE);
}
void parser_error(parser_t* p_parser, const char* p_text)
void parser_toplevel(parser_t* p_parser)
{
- if (parser_accept_str(p_parser, VAR, "import"))
+ if (parser_accept_str(p_parser, T_VAR, "import"))
parser_import(p_parser);
- else if (parser_accept_str(p_parser, VAR, "def"))
+ else if (parser_accept_str(p_parser, T_VAR, "def"))
parser_definition(p_parser);
else if (p_parser->p_lexer->scanner->p_input == stdin)
parser_expression(p_parser);
void parser_import(parser_t* p_parser)
{
- parser_expect(p_parser, VAR);
- parser_expect(p_parser, END);
+ parser_expect(p_parser, T_VAR);
+ parser_expect(p_parser, T_END);
}
void parser_definition(parser_t* p_parser)
{
- parser_expect(p_parser,VAR);
- if (parser_peek(p_parser)->type == LPAR) {
+ parser_expect(p_parser,T_VAR);
+ if (parser_peek(p_parser)->type == T_LPAR) {
parser_fn_stmnt(p_parser);
} else {
parser_expression(p_parser);
- parser_expect(p_parser,END);
+ parser_expect(p_parser,T_END);
}
}
void parser_expression(parser_t* p_parser)
{
- if (parser_accept(p_parser, LPAR)) {
+ if (parser_accept(p_parser, T_LPAR)) {
parser_expression(p_parser);
- parser_accept(p_parser, RPAR);
- } else if (parser_accept_str(p_parser, VAR, "if")) {
+ parser_accept(p_parser, T_RPAR);
+ } else if (parser_accept_str(p_parser, T_VAR, "if")) {
parser_if_stmnt(p_parser);
- } else if (parser_accept_str(p_parser, VAR, "fn")) {
+ } else if (parser_accept_str(p_parser, T_VAR, "fn")) {
parser_fn_stmnt(p_parser);
- } else if (parser_peek(p_parser)->type == VAR) {
- parser_expect(p_parser, VAR);
- if (parser_peek(p_parser)->type == LPAR) {
+ } else if (parser_peek(p_parser)->type == T_VAR) {
+ parser_expect(p_parser, T_VAR);
+ if (parser_peek(p_parser)->type == T_LPAR) {
parser_arglist(p_parser);
}
} else {
{
switch (parser_peek(p_parser)->type)
{
- case BOOL:
- case CHAR:
- case STRING:
- case INT:
- case FLOAT:
+ case T_BOOL:
+ case T_CHAR:
+ case T_STRING:
+ case T_INT:
+ case T_FLOAT:
parser_accept(p_parser, parser_peek(p_parser)->type);
break;
void parser_arglist(parser_t* p_parser)
{
- parser_expect(p_parser, LPAR);
- while(parser_peek(p_parser)->type != RPAR) {
+ parser_expect(p_parser, T_LPAR);
+ while(parser_peek(p_parser)->type != T_RPAR) {
parser_expression(p_parser);
- if(parser_peek(p_parser)->type != RPAR)
- parser_expect(p_parser, COMMA);
+ if(parser_peek(p_parser)->type != T_RPAR)
+ parser_expect(p_parser, T_COMMA);
}
- parser_expect(p_parser, RPAR);
+ parser_expect(p_parser, T_RPAR);
}
void parser_if_stmnt(parser_t* p_parser)
{
parser_expression(p_parser);
parser_expression(p_parser);
- parser_expect_str(p_parser,VAR,"else");
+ parser_expect_str(p_parser,T_VAR,"else");
parser_expression(p_parser);
- parser_expect(p_parser,END);
+ parser_expect(p_parser,T_END);
}
void parser_fn_stmnt(parser_t* p_parser)
{
- parser_expect(p_parser, LPAR);
- while(parser_peek(p_parser)->type != RPAR) {
- parser_expect(p_parser, VAR);
- if(parser_peek(p_parser)->type != RPAR)
- parser_expect(p_parser, COMMA);
+ parser_expect(p_parser, T_LPAR);
+ while(parser_peek(p_parser)->type != T_RPAR) {
+ parser_expect(p_parser, T_VAR);
+ if(parser_peek(p_parser)->type != T_RPAR)
+ parser_expect(p_parser, T_COMMA);
}
- parser_expect(p_parser, RPAR);
- while(parser_peek(p_parser)->type != END) {
+ parser_expect(p_parser, T_RPAR);
+ while(parser_peek(p_parser)->type != T_END) {
parser_expression(p_parser);
}
- parser_expect(p_parser, END);
+ parser_expect(p_parser, T_END);
}
/* SCLPL Parser