";" { return T_END; }
"," { return T_COMMA; }
"'" { return T_SQUOTE; }
+":" { return T_COLON; }
\\. { Value.character = yytext[1]; return T_CHAR; }
\\space { Value.character = ' '; return T_CHAR; }
return T_ID;
}
-[^ \r\t\n\[\]\{\}\(\)'\",;]+ {
+[^ \r\t\n\[\]\{\}\(\)'\",;:]+ {
Value.text = dupstring(yytext);
return T_ID;
}
-
%%
static void token_free(void* obj)
case T_COMMA: return "T_COMMA";
case T_ID: return "T_ID";
case T_END: return "T_END";
+ case T_COLON: return "T_COLON";
case T_SQUOTE: return "T_SQUOTE";
case T_DQUOTE: return "T_DQUOTE";
case T_END_FILE: return "T_END_FILE";
*****************************************************************************/
typedef enum {
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_REQUIRE,
- T_DEF, T_IF, T_FN, T_THEN, T_ELSE, T_END_FILE
+ T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE, T_DQUOTE, T_END, T_COLON,
+ T_REQUIRE, T_DEF, T_IF, T_FN, T_THEN, T_ELSE, T_END_FILE
} TokType;
typedef struct {
AST* let_body(AST* let);
void let_set_body(AST* let, AST* body);
+/* Symbol Table
+ *****************************************************************************/
+typedef struct SymTable {
+ struct SymTable* next;
+ char* name;
+} SymTable;
+
+SymTable* symbol_new(void);
+//void symbol_free(SymTable* sym);
+SymTable* symbol_push(SymTable* top, SymTable* newtop);
+SymTable* symbol_pop(SymTable* top);
+SymTable* symbol_get(const char* name);
+SymTable* symbol_map(SymTable* top, void (*apply)(SymTable*, void*), void* arg);
+
+/*
+Base Types:
+ bool
+ int
+ uint
+ u8 u16 u32 u64
+ i8 i16 i32 i64
+ uintptr intptr
+ rune
+ byte
+ string
+
+Reference:
+ u8&
+
+Array:
+ u8[] u8[10] u8[10][10]
+
+Function:
+ int (string[])
+
+Struct:
+
+Union:
+
+
+Examples:
+def main(args)
+ return 0;
+end
+
+def main(args : string[]) : int
+ return 0;
+end
+
+def main : int(string[])
+ fn(args)
+
+ end
+end
+
+def foo (123 : int);
+def foo : int 123;
+def foo 123;
+
+*/
+
+
/* Pretty Printing
*****************************************************************************/
void pprint_token_type(FILE* file, Tok* token);
expect(lexer(';')).to eq ['T_END']
end
+ it "should recognize :" do
+ expect(lexer(':')).to eq ['T_COLON']
+ end
+
it "should recognize all punctuation" do
expect(lexer('[](){}\',;')).to eq(
["T_LBRACK", "T_RBRACK", "T_LPAR", "T_RPAR", "T_LBRACE", "T_RBRACE",