diff --git a/src/codegen.cpp b/src/codegen.cpp index 1ba2c69..7dff78b 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -222,6 +222,10 @@ namespace types { return builder.builder->getInt32Ty(); case FundamentalTypeKind::Bool: return builder.builder->getInt1Ty(); + case FundamentalTypeKind::Char: + return builder.builder->getInt8Ty(); + case FundamentalTypeKind::Void: + return builder.builder->getVoidTy(); default: return builder.builder->getVoidTy(); } diff --git a/src/parsing.cpp b/src/parsing.cpp index f026de3..c58aae0 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -14,8 +14,24 @@ namespace parsing { stream.m_position = inner.m_position; - auto ty = new types::FundamentalType{ types::FundamentalTypeKind::Int }; - return std::unique_ptr{ ty }; + // TODO eventually make this be potentially more than one word + std::string type_name = token.content; + + if (type_name == "int") { + auto ty = new types::FundamentalType{ types::FundamentalTypeKind::Int }; + return std::unique_ptr{ ty }; + } + else if (type_name == "char") { + auto ty = new types::FundamentalType{ types::FundamentalTypeKind::Char }; + return std::unique_ptr{ ty }; + } + else if (type_name == "void") { + auto ty = new types::FundamentalType{ types::FundamentalTypeKind::Void }; + return std::unique_ptr{ ty }; + } + else { + throw std::runtime_error("Expected type name, got " + type_name); + } } catch (std::runtime_error& error) { return std::string{ error.what() }; diff --git a/src/types.cpp b/src/types.cpp index decbdaf..0f8194b 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -42,6 +42,12 @@ namespace types { switch (this->m_ty) { case FundamentalTypeKind::Int: return "Int"; + case FundamentalTypeKind::Bool: + return "Bool"; + case FundamentalTypeKind::Char: + return "Char"; + case FundamentalTypeKind::Void: + return "Void"; default: return "Unknown"; } diff --git a/src/types.h b/src/types.h index c8fe8ab..b9c40c1 100644 --- a/src/types.h +++ b/src/types.h @@ -20,7 +20,9 @@ namespace types { enum FundamentalTypeKind { Int, - Bool + Bool, + Char, + Void, }; class Type { diff --git a/test.c b/test.c index 106fdcb..cbfc826 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,4 @@ -void printf(int b); +void printf(char b); int fibonacci(int n) { if (n < 2)