diff --git a/src/ast.cpp b/src/ast.cpp index b5b908a..6ca32d1 100644 --- a/src/ast.cpp +++ b/src/ast.cpp @@ -91,6 +91,11 @@ namespace AST { out << " " << *param.first; } } + if (this->m_is_vararg) { + if (counter > 0) + out << ", "; + out << "..."; + } out << ") -> "; out << this->m_return_ty->formatted(); diff --git a/src/ast.h b/src/ast.h index 060fa00..d0fb707 100644 --- a/src/ast.h +++ b/src/ast.h @@ -176,6 +176,7 @@ namespace AST { private: std::unique_ptr m_return_ty; std::vector, std::unique_ptr>> m_params; + bool m_is_vararg; std::string m_name; std::optional>> m_statements; public: @@ -183,11 +184,13 @@ namespace AST { token::Metadata meta, std::unique_ptr return_ty, std::vector, std::unique_ptr>> params, + bool is_vararg, std::string name, std::optional>> statements) : TopLevelStatement{ meta } , m_return_ty{ std::move(return_ty) } , m_params{ std::move(params) } + , m_is_vararg{ is_vararg } , m_name{ name } , m_statements{ std::move(statements) } { } diff --git a/src/parsing.cpp b/src/parsing.cpp index 0b591dd..06de893 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -275,10 +275,20 @@ namespace parsing { inner.expect(token::Type::Symbol, "("); std::vector, std::unique_ptr>> params; + bool is_vararg = false; while (inner.peek().content != ")") { if (params.size() > 0) { inner.expect(token::Type::Symbol, ","); } + + if (inner.peek().content == ".") { + inner.next(); + inner.expect(token::Type::Symbol, "."); + inner.expect(token::Type::Symbol, "."); + is_vararg = true; + break; + } + auto param_ty = parse_type(inner).unwrap(); std::optional param_name{}; if (inner.peek().type == token::Type::Ident) { @@ -310,7 +320,14 @@ namespace parsing { stream.m_position = inner.m_position; - auto fun = new AST::Function{ before_meta + stream.metadata(), std::move(type), std::move(params), name_token.content, std::move(statements) }; + auto fun = new AST::Function{ + before_meta + stream.metadata(), + std::move(type), + std::move(params), + is_vararg, + name_token.content, + std::move(statements) + }; return std::unique_ptr{ fun }; } catch (std::runtime_error& error) { diff --git a/test.c b/test.c index 75c3f0c..d762adf 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,4 @@ -void printf(char*, int); +void printf(char*, ...); int fibonacci(int n) { if (n < 2)