*/
#include <libparse.h>
-AST* grammar_toplevel(Parser* p)
+static void require(Parser* p);
+static void type_annotation(Parser* p);
+static void type_definition(Parser* p);
+static void type(Parser* p);
+static void tuple(Parser* p);
+static void function(Parser* p);
+static void definition(Parser* p);
+static void expression(Parser* p);
+static void literal(Parser* p);
+static void arglist(Parser* p);
+static void if_stmnt(Parser* p);
+static void fn_stmnt(Parser* p);
+
+AST* toplevel(Parser* p)
{
AST* p_tree = NULL;
try {
if (accept_str(p, T_ID, "require"))
- grammar_require(p);
+ require(p);
else if (accept_str(p, T_ID, "type"))
- grammar_type_definition(p);
+ type_definition(p);
else if (accept_str(p, T_ID, "ann"))
- grammar_type_annotation(p);
+ type_annotation(p);
else if (accept_str(p, T_ID, "def"))
- grammar_definition(p);
+ definition(p);
else
- grammar_expression(p);
+ expression(p);
p_tree = get_tree(p);
} catch(ParseException) {
/* Do nothing, the tree is bad */
return p_tree;
}
-void grammar_require(Parser* p)
+static void require(Parser* p)
{
size_t mrk = mark(p);
expect(p, T_STRING);
reduce(p, mrk);
}
-void grammar_type_annotation(Parser* p)
+static void type_annotation(Parser* p)
{
size_t mrk = mark(p);
expect(p, T_ID);
- grammar_type(p);
+ type(p);
expect(p, T_END);
reduce(p, mrk);
}
-void grammar_type_definition(Parser* p)
+static void type_definition(Parser* p)
{
size_t mrk = mark(p);
expect(p, T_ID);
expect_str(p, T_ID, "is");
- grammar_type(p);
+ type(p);
expect(p, T_END);
reduce(p, mrk);
}
-void grammar_type(Parser* p) {
+static void type(Parser* p) {
if (accept(p, T_LBRACE)) {
- grammar_tuple(p);
+ tuple(p);
} else {
expect(p, T_ID);
if (accept(p, T_LPAR)) {
- grammar_function(p);
+ function(p);
}
}
}
-void grammar_tuple(Parser* p) {
+static void tuple(Parser* p) {
size_t mrk = mark(p);
insert(p, T_ID, lexer_dup("tuple"));
do {
- grammar_type(p);
+ type(p);
} while (accept(p, T_COMMA));
expect(p, T_RBRACE);
reduce(p, mrk);
}
-void grammar_function(Parser* p) {
+static void function(Parser* p) {
size_t mark1 = mark(p) - 1;
size_t mark2 = mark(p);
while (!accept(p, T_RPAR)) {
- grammar_type(p);
+ type(p);
if (T_RPAR != peek(p)->type)
expect(p, T_COMMA);
}
reduce(p, mark1);
}
-void grammar_definition(Parser* p)
+static void definition(Parser* p)
{
size_t mrk = mark(p);
expect(p,T_ID);
if (peek(p)->type == T_LPAR) {
insert(p, T_ID, lexer_dup("fn"));
- grammar_fn_stmnt(p);
+ fn_stmnt(p);
} else {
- grammar_expression(p);
+ expression(p);
expect(p,T_END);
}
reduce(p, mrk);
}
-void grammar_expression(Parser* p)
+static void expression(Parser* p)
{
if (accept(p, T_LPAR)) {
size_t mrk = mark(p);
- grammar_expression(p);
+ expression(p);
expect(p, T_RPAR);
reduce(p, mrk);
} else if (accept_str(p, T_ID, "if")) {
- grammar_if_stmnt(p);
+ if_stmnt(p);
} else if (accept_str(p, T_ID, "fn")) {
- grammar_fn_stmnt(p);
+ fn_stmnt(p);
} else if (peek(p)->type == T_ID) {
expect(p, T_ID);
if (peek(p)->type == T_LPAR) {
- grammar_arglist(p);
+ arglist(p);
}
} else {
- grammar_literal(p);
+ literal(p);
}
}
-void grammar_literal(Parser* p)
+static void literal(Parser* p)
{
switch (peek(p)->type) {
case T_BOOL:
}
}
-void grammar_arglist(Parser* p)
+static void arglist(Parser* p)
{
size_t mrk = mark(p);
expect(p, T_LPAR);
while(peek(p)->type != T_RPAR) {
- grammar_expression(p);
+ expression(p);
if(peek(p)->type != T_RPAR)
expect(p, T_COMMA);
}
reduce(p, mrk);
}
-void grammar_if_stmnt(Parser* p)
+static void if_stmnt(Parser* p)
{
size_t mrk = mark(p);
- grammar_expression(p);
- grammar_expression(p);
+ expression(p);
+ expression(p);
if (accept_str(p, T_ID, "else")) {
- grammar_expression(p);
+ expression(p);
}
expect(p,T_END);
reduce(p, mrk);
}
-void grammar_fn_stmnt(Parser* p)
+static void fn_stmnt(Parser* p)
{
size_t mark1 = mark(p);
expect(p, T_LPAR);
expect(p, T_RPAR);
reduce(p, mark2);
while(peek(p)->type != T_END) {
- grammar_expression(p);
+ expression(p);
}
expect(p, T_END);
reduce(p, mark1);
mem_release(p_tok->value);
}
-Token* lex_tok_new(TokenType type, void* val) {
+Token* token(TokenType type, void* val) {
Token* p_tok = (Token*)mem_allocate(sizeof(Token), &lex_tok_free);
p_tok->type = type;
p_tok->value = val;
Token* lexer_read(Lexer* p_lexer) {
Token* p_tok = NULL;
- size_t line;
- size_t col;
+ size_t line, col;
char* text = read(p_lexer, &line, &col);
if (NULL != text) {
p_tok = lexer_make_token(line, col, text);
static Token* lexer_make_token(size_t line, size_t col, char* text) {
Token* p_tok = NULL;
if (0 == strcmp(text,"end")) {
- p_tok = lex_tok_new(T_END, NULL);
+ p_tok = token(T_END, NULL);
} else if (lexer_oneof("()[]{};,'", text[0])) {
p_tok = lexer_punc(text);
} else if ('"' == text[0]) {
text[strlen(text)-1] = '\0';
- p_tok = lex_tok_new(T_STRING, lexer_dup(&text[1]));
+ p_tok = token(T_STRING, lexer_dup(&text[1]));
} else if (text[0] == '\\') {
p_tok = lexer_char(text);
} else if ((text[0] == '0') && lexer_oneof("bodh",text[1])) {
{
Token* p_tok = NULL;
switch (text[0]) {
- 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;
- case '\'': p_tok = lex_tok_new(T_SQUOTE, NULL); break;
+ case '(': p_tok = token(T_LPAR, NULL); break;
+ case ')': p_tok = token(T_RPAR, NULL); break;
+ case '{': p_tok = token(T_LBRACE, NULL); break;
+ case '}': p_tok = token(T_RBRACE, NULL); break;
+ case '[': p_tok = token(T_LBRACK, NULL); break;
+ case ']': p_tok = token(T_RBRACK, NULL); break;
+ case ';': p_tok = token(T_END, NULL); break;
+ case ',': p_tok = token(T_COMMA, NULL); break;
+ case '\'': p_tok = token(T_SQUOTE, NULL); break;
}
return p_tok;
}
"\v\0vtab"
};
if (strlen(text) == 2) {
- p_tok = lex_tok_new(T_CHAR, (void*)((intptr_t)text[1]));
+ p_tok = token(T_CHAR, (void*)((intptr_t)text[1]));
} else {
for(int i = 0; i < 5; i++) {
if (0 == strcmp(&text[1], &(lookup_table[i][2]))) {
- p_tok = lex_tok_new(T_CHAR, (void*)((intptr_t)lookup_table[i][0]));
+ p_tok = token(T_CHAR, (void*)((intptr_t)lookup_table[i][0]));
break;
}
}
errno = 0;
*p_int = strtol(text, &end, base);
assert(errno == 0);
- return (end[0] == '\0') ? lex_tok_new(T_INT, p_int) : NULL;
+ return (end[0] == '\0') ? token(T_INT, p_int) : NULL;
}
static Token* lexer_float(char* text)
errno = 0;
*p_dbl = strtod(text, &end);
assert(errno == 0);
- return (end[0] == '\0') ? lex_tok_new(T_FLOAT, p_dbl) : NULL;
+ return (end[0] == '\0') ? token(T_FLOAT, p_dbl) : NULL;
}
static Token* lexer_bool(char* text)
{
- return lex_tok_new(T_BOOL, (void*)((intptr_t)((0 == strcmp(text,"true")) ? true : false)));
+ return token(T_BOOL, (void*)((intptr_t)((0 == strcmp(text,"true")) ? true : false)));
}
static Token* lexer_var(char* text)
{
- return lex_tok_new(T_ID, lexer_dup(text));
+ return token(T_ID, lexer_dup(text));
}
static bool lexer_oneof(const char* class, char c) {
/*****************************************************************************/
-char* read(Lexer* ctx, size_t* line, size_t* column) {
+static char* read(Lexer* ctx, size_t* line, size_t* column) {
char* p_tok = NULL;
skip_ws(ctx);
*line = ctx->lineno;
p_tok = read_string(ctx);
} else {
size_t start = ctx->index;
- while(!oneof(ctx," \t\r\n()[]{};,'\"") &&
- (current(ctx) != '\0')) {
+ while(!oneof(ctx," \t\r\n()[]{};,'\"") && (current(ctx) != '\0')) {
ctx->index++;
}
p_tok = dup(ctx, start, ctx->index - start);
return tok;
}
-bool eof(Lexer* ctx)
+static bool eof(Lexer* ctx)
{
return (eol(ctx) && feof(ctx->p_input));
}
-bool eol(Lexer* ctx)
+static bool eol(Lexer* ctx)
{
bool ret = true;
size_t index = ctx->index;
return ret;
}
-void getline(Lexer* ctx) {
+static void getline(Lexer* ctx) {
int c;
size_t capacity = 8;
size_t index = 0;
return p_str;
}
-
// Lexer routines
Lexer* lexer_new(char* p_prompt, FILE* p_input);
-Token* lex_tok_new(TokenType type, void* val);
+Token* token(TokenType type, void* val);
Token* lexer_read(Lexer* p_lexer);
void lexer_skipline(Lexer* p_lexer);
char* lexer_dup(const char* p_old);
bool tree_is_formtype(AST* p_tree, const char* val);
// Grammar Routines
-AST* grammar_toplevel(Parser* p);
-void grammar_require(Parser* p);
-void grammar_type_annotation(Parser* p);
-void grammar_type_definition(Parser* p);
-void grammar_type(Parser* p);
-void grammar_tuple(Parser* p);
-void grammar_function(Parser* p);
-void grammar_definition(Parser* p);
-void grammar_expression(Parser* p);
-void grammar_literal(Parser* p);
-void grammar_arglist(Parser* p);
-void grammar_if_stmnt(Parser* p);
-void grammar_fn_stmnt(Parser* p);
+AST* toplevel(Parser* p);
#endif /* LIBPARSE_H */
}
void insert(Parser* p_parser, TokenType type, void* value) {
- Token* p_tok = lex_tok_new(type, value);
+ Token* p_tok = token(type, value);
AST* p_tree = tree_new(ATOM, p_tok);
vec_push_back(p_parser->p_tok_buf, p_tree);
}
static int exec_repl(void) {
Parser* p_parser = parser_new(":> ", stdin);
while(!parser_eof(p_parser)) {
- AST* p_tree = grammar_toplevel(p_parser);
+ AST* p_tree = toplevel(p_parser);
if (NULL != p_tree) {
AST* p_ast = tree_convert(p_tree);
pprint_tree(stdout, p_ast, 0);
Parser* p_parser = parser_new(NULL, input);
vec_t* p_vec = vec_new(0);
while(!parser_eof(p_parser)) {
- AST* p_tree = grammar_toplevel(p_parser);
+ AST* p_tree = toplevel(p_parser);
if (NULL != p_tree) {
AST* p_ast = tree_convert(p_tree);
mem_release(p_tree);