瀏覽代碼

Fix parsing for comments; add global ODIN_* string constants

Ginger Bill 8 年之前
父節點
當前提交
cbb70c7873
共有 5 個文件被更改,包括 12 次插入57 次删除
  1. 1 1
      build.bat
  2. 1 42
      code/demo.odin
  3. 5 0
      src/checker/checker.c
  4. 4 7
      src/parser.c
  5. 1 7
      src/string.c

+ 1 - 1
build.bat

@@ -4,7 +4,7 @@
 set exe_name=odin.exe
 
 :: Debug = 0, Release = 1
-set release_mode=1
+set release_mode=0
 
 set compiler_flags= -nologo -Oi -TC -W4 -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR-
 

+ 1 - 42
code/demo.odin

@@ -1,46 +1,5 @@
 #import "fmt.odin"
 
-variadic :: proc(args: ..any) {
-	for i := 0; i < args.count; i++ {
-		match type a : args[i] {
-		case u128: fmt.println("u128", a)
-		case i128: fmt.println("i128", a)
-		}
-	}
-
-	fmt.println(..args)
-}
-
 main :: proc() {
-	fmt.println("Hellope, everybody!")
-
-	variadic(1 as u128, 1 as i128)
-
-	// x: i128 = 321312321
-	// y: i128 = 123123123
-	// z: i128
-	// x *= x; x *= x
-	// y *= y; y *= y
-	// fmt.println("x =", x)
-	// fmt.println("y =", y)
-	// z = x + y; fmt.println("x + y", z)
-	// z = x - y; fmt.println("x - y", z)
-	// z = x * y; fmt.println("x * y", z)
-	// z = x / y; fmt.println("x / y", z)
-	// z = x % y; fmt.println("x % y", z)
-	// z = x & y; fmt.println("x & y", z)
-	// z = x ~ y; fmt.println("x ~ y", z)
-	// z = x | y; fmt.println("x | y", z)
-	// z = x &~ y; fmt.println("x &~ y", z)
-
-	// z = -x
-	// z = ~x
-
-	// b: bool
-	// b = x == y; fmt.println("x == y", b)
-	// b = x != y; fmt.println("x != y", b)
-	// b = x <  y; fmt.println("x <  y", b)
-	// b = x <= y; fmt.println("x <= y", b)
-	// b = x >  y; fmt.println("x >  y", b)
-	// b = x >= y; fmt.println("x >= y", b)
+	fmt.println("Hellope, World!")
 }

+ 5 - 0
src/checker/checker.c

@@ -528,6 +528,11 @@ void init_universal_scope(void) {
 
 	add_global_entity(make_entity_nil(a, str_lit("nil"), t_untyped_nil));
 
+	add_global_constant(a, str_lit("ODIN_OS"),      t_untyped_string, make_exact_value_string(str_lit("windows")));
+	add_global_constant(a, str_lit("ODIN_ARCH"),    t_untyped_string, make_exact_value_string(str_lit("amd64")));
+	add_global_constant(a, str_lit("ODIN_VERSION"), t_untyped_string, make_exact_value_string(str_lit(VERSION_STRING)));
+
+
 // Builtin Procedures
 	for (isize i = 0; i < gb_count_of(builtin_procs); i++) {
 		BuiltinProcId id = cast(BuiltinProcId)i;

+ 4 - 7
src/parser.c

@@ -100,6 +100,7 @@ AstNodeArray make_ast_node_array(AstFile *f) {
 }
 
 
+
 #define AST_NODE_KINDS \
 	AST_NODE_KIND(BasicLit, "basic literal", Token) \
 	AST_NODE_KIND(Ident,    "identifier",    Token) \
@@ -2656,10 +2657,6 @@ AstNode *parse_stmt(AstFile *f) {
 	AstNode *s = NULL;
 	Token token = f->curr_token;
 	switch (token.kind) {
-	case Token_Comment:
-		next_token(f);
-		return parse_stmt(f);
-
 	// Operands
 	case Token_Identifier:
 	case Token_Integer:
@@ -2886,9 +2883,6 @@ ParseFileError init_ast_file(AstFile *f, String fullpath) {
 				if (token.kind == Token_Invalid) {
 					return ParseFile_InvalidToken;
 				}
-				if (token.kind == Token_Comment) {
-					continue;
-				}
 				array_add(&f->tokens, token);
 
 				if (token.kind == Token_EOF) {
@@ -3097,6 +3091,9 @@ void parse_file(Parser *p, AstFile *f) {
 		base_dir.len--;
 	}
 
+	while (f->curr_token.kind == Token_Comment) {
+		next_token(f);
+	}
 
 	f->decls = parse_stmt_list(f);
 

+ 1 - 7
src/string.c

@@ -49,12 +49,6 @@ gb_inline String make_string_c(char *text) {
 #define str_lit(c_str) make_string(cast(u8 *)c_str, gb_size_of(c_str)-1)
 
 
-gb_inline bool are_strings_equal(String a, String b) {
-	if (a.len == b.len) {
-		return gb_memcompare(a.text, b.text, a.len) == 0;
-	}
-	return false;
-}
 
 gb_inline bool str_eq_ignore_case(String a, String b) {
 	if (a.len == b.len) {
@@ -125,7 +119,7 @@ GB_COMPARE_PROC(string_cmp_proc) {
 // template <size_t N> gb_inline bool operator ==(char const (&a)[N], String b) { return make_string(cast(u8 *)a, N-1) == b; }
 // template <size_t N> gb_inline bool operator !=(char const (&a)[N], String b) { return make_string(cast(u8 *)a, N-1) != b; }
 
-gb_inline bool str_eq(String a, String b) { return are_strings_equal(a, b) != 0; }
+gb_inline bool str_eq(String a, String b) { return a.len == b.len ? gb_memcompare(a.text, b.text, a.len) == 0 : false; }
 gb_inline bool str_ne(String a, String b) { return !str_eq(a, b);                }
 gb_inline bool str_lt(String a, String b) { return string_compare(a, b) < 0;     }
 gb_inline bool str_gt(String a, String b) { return string_compare(a, b) > 0;     }