Changed how functions are created

This commit is contained in:
Pasha Bibko
2025-07-23 21:58:23 +01:00
parent 004f859cc7
commit 28049ece94
6 changed files with 144 additions and 118 deletions

View File

@@ -54,6 +54,8 @@ namespace LXC::Lexer
Else, Else,
Return, Return,
FunctionDef,
// === User defined === // // === User defined === //
StringLiteral = TokenClass::UserDefined, StringLiteral = TokenClass::UserDefined,
@@ -73,6 +75,9 @@ namespace LXC::Lexer
CloseParen, CloseParen,
OpenParen, OpenParen,
CloseCrocodile,
OpenCrocodile,
Comma, Comma,
// === Misc === // // === Misc === //

View File

@@ -29,7 +29,8 @@ namespace LXC::Internal
c == ',' || c == '[' || c == ',' || c == '[' ||
c == ']' || c == '{' || c == ']' || c == '{' ||
c == '}' || c == '(' || c == '}' || c == '(' ||
c == ')'; c == ')' || c == '<' ||
c == '>';
} }
static const std::unordered_map<std::string_view, Lexer::Token::TokenType> symbolAndOpMap = static const std::unordered_map<std::string_view, Lexer::Token::TokenType> symbolAndOpMap =
@@ -52,17 +53,21 @@ namespace LXC::Internal
{ "{", Lexer::Token::OpenBrace }, { "{", Lexer::Token::OpenBrace },
{ ")", Lexer::Token::CloseParen }, { ")", Lexer::Token::CloseParen },
{ "(", Lexer::Token::OpenParen } { "(", Lexer::Token::OpenParen },
{ ">", Lexer::Token::CloseCrocodile },
{ "<", Lexer::Token::OpenCrocodile }
}; };
static const std::unordered_map<std::string_view, Lexer::Token::TokenType> keywords = static const std::unordered_map<std::string_view, Lexer::Token::TokenType> keywords =
{ {
{ "for", Lexer::Token::For }, { "for", Lexer::Token::For },
{ "while", Lexer::Token::While }, { "while", Lexer::Token::While },
{ "if", Lexer::Token::If }, { "if", Lexer::Token::If },
{ "elif", Lexer::Token::ElseIf }, { "elif", Lexer::Token::ElseIf },
{ "else", Lexer::Token::Else }, { "else", Lexer::Token::Else },
{ "return", Lexer::Token::Return } { "return", Lexer::Token::Return },
{ "func", Lexer::Token::FunctionDef },
}; };
} }

View File

@@ -75,6 +75,8 @@ namespace LXC::Lexer
TOKEN_TYPE_CASE(Token::Else); TOKEN_TYPE_CASE(Token::Else);
TOKEN_TYPE_CASE(Token::Return); TOKEN_TYPE_CASE(Token::Return);
TOKEN_TYPE_CASE(Token::FunctionDef);
TOKEN_TYPE_CASE(Token::StringLiteral); TOKEN_TYPE_CASE(Token::StringLiteral);
TOKEN_TYPE_CASE(Token::NumLiteral); TOKEN_TYPE_CASE(Token::NumLiteral);
TOKEN_TYPE_CASE(Token::Identifier); TOKEN_TYPE_CASE(Token::Identifier);
@@ -86,6 +88,8 @@ namespace LXC::Lexer
TOKEN_TYPE_CASE(Token::OpenBrace); TOKEN_TYPE_CASE(Token::OpenBrace);
TOKEN_TYPE_CASE(Token::CloseParen); TOKEN_TYPE_CASE(Token::CloseParen);
TOKEN_TYPE_CASE(Token::OpenParen); TOKEN_TYPE_CASE(Token::OpenParen);
TOKEN_TYPE_CASE(Token::CloseCrocodile);
TOKEN_TYPE_CASE(Token::OpenCrocodile);
TOKEN_TYPE_CASE(Token::Comma); TOKEN_TYPE_CASE(Token::Comma);
TOKEN_TYPE_CASE(Token::End_of_file); TOKEN_TYPE_CASE(Token::End_of_file);

View File

@@ -1,4 +1,4 @@
int fib(int num) func<int> fib(int num)
{ {
# Base cases # # Base cases #
if (n == 0) { return 0 } if (n == 0) { return 0 }
@@ -8,7 +8,7 @@ int fib(int num)
return fib(n - 1) + fib(n - 2) return fib(n - 1) + fib(n - 2)
} }
int main(void) func<int> main(void)
{ {
int res = fib(8) int res = fib(8)
return res == 21 return res == 21

View File

@@ -1,9 +1,9 @@
int add(int a, int b) func<int> add(int a, int b)
{ {
return a + b return a + b
} }
int main(void) func<int> main(void)
{ {
int c = add(3, 4) int c = add(3, 4)
if (c == 7) if (c == 7)

View File

@@ -123,53 +123,59 @@ namespace LXC::Lexer
Util::ReturnVal tokens = TokenizeFile(fileContents); Util::ReturnVal tokens = TokenizeFile(fileContents);
Internal::ExpectTokens(tokens, Internal::ExpectTokens(tokens,
{ {
Token::Identifier, // int Token::FunctionDef, // func
Token::Identifier, // add Token::OpenCrocodile, // <
Token::OpenParen, // ( Token::Identifier, // int
Token::Identifier, // int Token::CloseCrocodile, // >
Token::Identifier, // a Token::Identifier, // add
Token::Comma, // , Token::OpenParen, // (
Token::Identifier, // int Token::Identifier, // int
Token::Identifier, // b Token::Identifier, // a
Token::CloseParen, // ) Token::Comma, // ,
Token::OpenBrace, // { Token::Identifier, // int
Token::Return, // return Token::Identifier, // b
Token::Identifier, // a Token::CloseParen, // )
Token::Add, // + Token::OpenBrace, // {
Token::Identifier, // b Token::Return, // return
Token::CloseBrace, // } Token::Identifier, // a
Token::Add, // +
Token::Identifier, // b
Token::CloseBrace, // }
Token::Identifier, // int Token::FunctionDef, // func
Token::Identifier, // main Token::OpenCrocodile, // <
Token::OpenParen, // ( Token::Identifier, // int
Token::Identifier, // void Token::CloseCrocodile, // >
Token::CloseParen, // ) Token::Identifier, // main
Token::OpenBrace, // { Token::OpenParen, // (
Token::Identifier, // int Token::Identifier, // void
Token::Identifier, // c Token::CloseParen, // )
Token::Assign, // = Token::OpenBrace, // {
Token::Identifier, // add Token::Identifier, // int
Token::OpenParen, // ( Token::Identifier, // c
Token::NumLiteral, // 3 Token::Assign, // =
Token::Comma, // , Token::Identifier, // add
Token::NumLiteral, // 4 Token::OpenParen, // (
Token::CloseParen, // ) Token::NumLiteral, // 3
Token::If, // if Token::Comma, // ,
Token::OpenParen, // ( Token::NumLiteral, // 4
Token::Identifier, // c Token::CloseParen, // )
Token::Eql, // == Token::If, // if
Token::NumLiteral, // 7 Token::OpenParen, // (
Token::CloseParen, // ) Token::Identifier, // c
Token::OpenBrace, // { Token::Eql, // ==
Token::Return, // return Token::NumLiteral, // 7
Token::NumLiteral, // 0 Token::CloseParen, // )
Token::CloseBrace, // } Token::OpenBrace, // {
Token::Else, // else Token::Return, // return
Token::OpenBrace, // { Token::NumLiteral, // 0
Token::Return, // return Token::CloseBrace, // }
Token::NumLiteral, // 1 Token::Else, // else
Token::CloseBrace, // } Token::OpenBrace, // {
Token::CloseBrace // } Token::Return, // return
Token::NumLiteral, // 1
Token::CloseBrace, // }
Token::CloseBrace // }
}); });
} }
@@ -180,73 +186,79 @@ namespace LXC::Lexer
Util::ReturnVal tokens = TokenizeFile(fileContents); Util::ReturnVal tokens = TokenizeFile(fileContents);
Internal::ExpectTokens(tokens, Internal::ExpectTokens(tokens,
{ {
Token::Identifier, // int Token::FunctionDef, // func
Token::Identifier, // fib Token::OpenCrocodile, // <
Token::OpenParen, // ( Token::Identifier, // int
Token::Identifier, // int Token::CloseCrocodile, // >
Token::Identifier, // num Token::Identifier, // fib
Token::CloseParen, // ) Token::OpenParen, // (
Token::OpenBrace, // { Token::Identifier, // int
Token::Identifier, // num
Token::CloseParen, // )
Token::OpenBrace, // {
Token::If, // if Token::If, // if
Token::OpenParen, // ( Token::OpenParen, // (
Token::Identifier, // n Token::Identifier, // n
Token::Eql, // == Token::Eql, // ==
Token::NumLiteral, // 0 Token::NumLiteral, // 0
Token::CloseParen, // ) Token::CloseParen, // )
Token::OpenBrace, // { Token::OpenBrace, // {
Token::Return, // return Token::Return, // return
Token::NumLiteral, // 0 Token::NumLiteral, // 0
Token::CloseBrace, // } Token::CloseBrace, // }
Token::If, // if Token::If, // if
Token::OpenParen, // ( Token::OpenParen, // (
Token::Identifier, // n Token::Identifier, // n
Token::Eql, // == Token::Eql, // ==
Token::NumLiteral, // 1 Token::NumLiteral, // 1
Token::CloseParen, // ) Token::CloseParen, // )
Token::OpenBrace, // { Token::OpenBrace, // {
Token::Return, // return Token::Return, // return
Token::NumLiteral, // 1 Token::NumLiteral, // 1
Token::CloseBrace, // } Token::CloseBrace, // }
Token::Return, // return Token::Return, // return
Token::Identifier, // fib Token::Identifier, // fib
Token::OpenParen, // ( Token::OpenParen, // (
Token::Identifier, // n Token::Identifier, // n
Token::Sub, // - Token::Sub, // -
Token::NumLiteral, // 1 Token::NumLiteral, // 1
Token::CloseParen, // ) Token::CloseParen, // )
Token::Add, // + Token::Add, // +
Token::Identifier, // fib Token::Identifier, // fib
Token::OpenParen, // ( Token::OpenParen, // (
Token::Identifier, // n Token::Identifier, // n
Token::Sub, // - Token::Sub, // -
Token::NumLiteral, // 2 Token::NumLiteral, // 2
Token::CloseParen, // ) Token::CloseParen, // )
Token::CloseBrace, // } Token::CloseBrace, // }
Token::Identifier, // int Token::FunctionDef, // func
Token::Identifier, // main Token::OpenCrocodile, // <
Token::OpenParen, // ( Token::Identifier, // int
Token::Identifier, // void Token::CloseCrocodile, // >
Token::CloseParen, // ) Token::Identifier, // main
Token::OpenParen, // (
Token::Identifier, // void
Token::CloseParen, // )
Token::OpenBrace, // { Token::OpenBrace, // {
Token::Identifier, // int Token::Identifier, // int
Token::Identifier, // res Token::Identifier, // res
Token::Assign, // = Token::Assign, // =
Token::Identifier, // fib Token::Identifier, // fib
Token::OpenParen, // ( Token::OpenParen, // (
Token::NumLiteral, // 8 Token::NumLiteral, // 8
Token::CloseParen, // ) Token::CloseParen, // )
Token::Return, // return Token::Return, // return
Token::Identifier, // res Token::Identifier, // res
Token::Eql, // == Token::Eql, // ==
Token::NumLiteral, // 21 Token::NumLiteral, // 21
Token::CloseBrace // } Token::CloseBrace // }
}); });
} }
} }