<<EOF>> { return T_END_FILE; }
-"end" { return T_END; }
-"(" { return T_LPAR; }
-")" { return T_RPAR; }
-"[" { return T_LBRACK; }
-"]" { return T_RBRACK; }
-"{" { return T_LBRACE; }
-"}" { return T_RBRACE; }
-";" { return T_END; }
-"," { return T_COMMA; }
-"'" { return T_SQUOTE; }
-":" { return T_COLON; }
-"&" { return T_AMP; }
+"let" { return T_LET; }
+"if" { return T_IF; }
+"then" { return T_THEN; }
+"else" { return T_ELSE; }
+"end" { return T_END; }
+"(" { return T_LPAR; }
+")" { return T_RPAR; }
+"[" { return T_LBRACK; }
+"]" { return T_RBRACK; }
+"{" { return T_LBRACE; }
+"}" { return T_RBRACE; }
+";" { return T_END; }
+"," { return T_COMMA; }
+"'" { return T_SQUOTE; }
+":" { return T_COLON; }
+"&" { return T_AMP; }
\\. { Value.character = yytext[1]; return T_CHAR; }
\\space { Value.character = ' '; return T_CHAR; }
\\return { Value.character = '\r'; return T_CHAR; }
\\tab { Value.character = '\t'; return T_CHAR; }
\\vtab { Value.character = '\v'; return T_CHAR; }
-\\[a-z]+ { Value.text = dupstring(yytext); return T_ID; }
0b[01]+ {
Value.integer = strtol(&yytext[2], NULL, 2);
return T_INT;
}
-0[b0dh][0-9a-fA-F]+ {
- Value.text = dupstring(yytext);
- return T_ID;
-}
-
[+-]?[0-9]+ {
Value.integer = strtol(&yytext[0], NULL, 10);
return T_INT;
return T_BOOL;
}
-"require" { return T_REQUIRE; }
-"let" { return T_LET; }
-"if" { return T_IF; }
-"fn" { return T_FN; }
-"then" { return T_THEN; }
-"else" { return T_ELSE; }
-
[a-zA-Z_][a-zA-Z0-9_]* {
Value.text = dupstring(yytext);
return T_ID;
}
-[^ \r\t\n\[\]\{\}\(\)'\",;:]+ {
- Value.text = dupstring(yytext);
- return T_ID;
-}
+. { return T_ERROR; }
%%
if (tok->type != T_END_FILE)
memcpy(&(tok->value), &Value, sizeof(Value));
}
-
-void fetchline(Parser* ctx)
-{
-}
-
static AST* const_definition(Parser* p) {
AST* expr;
Tok* id = expect_val(p, T_ID);
- if (peek(p)->type == T_LPAR) {
- expr = function(p);
- } else {
+// if (peek(p)->type == T_LPAR) {
+// expr = function(p);
+// } else {
type_annotation(p);
expr = const_expression(p);
expect(p, T_END);
- }
+// }
return Def(id, expr);
}
if (accept(p, T_LPAR)) {
expr = const_expression(p);
expect(p, T_RPAR);
- } else if (accept(p, T_FN)) {
- expr = function(p);
} else if (match(p, T_ID)) {
expr = Ident(expect_val(p, T_ID));
} else {
return expr;
}
+static void type_annotation(Parser* p) {
+ expect(p, T_ID);
+ /* array type */
+ if (accept(p,T_LBRACK)) {
+ accept(p, T_INT);
+ expect(p, T_RBRACK);
+ /* reference type */
+ } else if (accept(p, T_AMP)) {
+ // TODO: implement reference types
+ }
+}
+
+static AST* literal(Parser* p) {
+ AST* ret = NULL;
+ Tok* tok = peek(p);
+ switch (tok->type) {
+ case T_BOOL:
+ case T_CHAR:
+ case T_STRING:
+ case T_INT:
+ case T_FLOAT:
+ ret = token_to_tree(expect_val(p, tok->type));
+ break;
+ default:
+ error(p, "Expected a literal");
+ }
+ return ret;
+}
+
+static AST* token_to_tree(Tok* tok) {
+ switch (tok->type) {
+ case T_BOOL: return Bool(tok);
+ case T_CHAR: return Char(tok);
+ case T_STRING: return String(tok);
+ case T_INT: return Integer(tok);
+ case T_FLOAT: return Float(tok);
+ case T_ID: return Ident(tok);
+ default: return NULL;
+ }
+}
+
+
+#if 0
static AST* definition(Parser* p) {
AST* expr;
Tok* id = expect_val(p, T_ID);
- if (peek(p)->type == T_LPAR) {
- expr = function(p);
- } else {
+// if (peek(p)->type == T_LPAR) {
+// expr = function(p);
+// } else {
type_annotation(p);
expr = expression(p);
expect(p, T_END);
- }
+// }
return Def(id, expr);
}
expect(p, T_RPAR);
} else if (accept(p, T_IF)) {
expr = if_stmnt(p);
- } else if (accept(p, T_FN)) {
- expr = function(p);
} else if (match(p, T_ID)) {
expr = Ident(expect_val(p,T_ID));
} else {
return expr;
}
+/*
static AST* function(Parser* p) {
AST* func = Func();
expect(p, T_LPAR);
expect(p, T_END);
return func;
}
-
-static void type_annotation(Parser* p) {
- expect(p, T_ID);
- /* array type */
- if (accept(p,T_LBRACK)) {
- accept(p, T_INT);
- expect(p, T_RBRACK);
- /* reference type */
- } else if (accept(p, T_AMP)) {
- // TODO: implement reference types
- }
-}
-
-static AST* literal(Parser* p) {
- AST* ret = NULL;
- Tok* tok = peek(p);
- switch (tok->type) {
- case T_BOOL:
- case T_CHAR:
- case T_STRING:
- case T_INT:
- case T_FLOAT:
- ret = token_to_tree(expect_val(p, tok->type));
- break;
- default:
- error(p, "Expected a literal");
- }
- return ret;
-}
+*/
static AST* expr_block(Parser* p) {
AST* block = NULL;
return block;
}
-static AST* token_to_tree(Tok* tok) {
- switch (tok->type) {
- case T_BOOL: return Bool(tok);
- case T_CHAR: return Char(tok);
- case T_STRING: return String(tok);
- case T_INT: return Integer(tok);
- case T_FLOAT: return Float(tok);
- case T_ID: return Ident(tok);
- default: return NULL;
- }
-}
-
static AST* if_stmnt(Parser* p) {
AST* ifexpr = IfExpr();
ifexpr_set_cond( ifexpr, expression(p) );
expect(p,T_RPAR);
return app;
}
+#endif
/* Token Types
*****************************************************************************/
typedef enum {
- T_NONE, T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING, T_LBRACE, T_RBRACE,
- T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE, T_DQUOTE, T_END,
- T_COLON, T_AMP, T_REQUIRE, T_LET, T_IF, T_FN, T_THEN, T_ELSE, T_END_FILE
+ T_NONE, T_ERROR, T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING, T_LBRACE,
+ T_RBRACE, T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE, T_DQUOTE,
+ T_END, T_COLON, T_AMP, T_LET, T_IF, T_THEN, T_ELSE, T_END_FILE
} TokType;
typedef struct {