Changed how functions are created
This commit is contained in:
@@ -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 === //
|
||||||
|
|||||||
@@ -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 },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 // }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user