diff --git a/Lexer/inc/Token.h b/Lexer/inc/Token.h index bfc0892..38dba29 100644 --- a/Lexer/inc/Token.h +++ b/Lexer/inc/Token.h @@ -54,6 +54,8 @@ namespace LXC::Lexer Else, Return, + FunctionDef, + // === User defined === // StringLiteral = TokenClass::UserDefined, @@ -73,6 +75,9 @@ namespace LXC::Lexer CloseParen, OpenParen, + CloseCrocodile, + OpenCrocodile, + Comma, // === Misc === // diff --git a/Lexer/src/Lexer.cpp b/Lexer/src/Lexer.cpp index c24df12..7d0cf23 100644 --- a/Lexer/src/Lexer.cpp +++ b/Lexer/src/Lexer.cpp @@ -29,7 +29,8 @@ namespace LXC::Internal c == ',' || c == '[' || c == ']' || c == '{' || c == '}' || c == '(' || - c == ')'; + c == ')' || c == '<' || + c == '>'; } static const std::unordered_map symbolAndOpMap = @@ -52,17 +53,21 @@ namespace LXC::Internal { "{", Lexer::Token::OpenBrace }, { ")", Lexer::Token::CloseParen }, - { "(", Lexer::Token::OpenParen } + { "(", Lexer::Token::OpenParen }, + + { ">", Lexer::Token::CloseCrocodile }, + { "<", Lexer::Token::OpenCrocodile } }; static const std::unordered_map keywords = { - { "for", Lexer::Token::For }, - { "while", Lexer::Token::While }, - { "if", Lexer::Token::If }, - { "elif", Lexer::Token::ElseIf }, - { "else", Lexer::Token::Else }, - { "return", Lexer::Token::Return } + { "for", Lexer::Token::For }, + { "while", Lexer::Token::While }, + { "if", Lexer::Token::If }, + { "elif", Lexer::Token::ElseIf }, + { "else", Lexer::Token::Else }, + { "return", Lexer::Token::Return }, + { "func", Lexer::Token::FunctionDef }, }; } diff --git a/Lexer/src/Token.cpp b/Lexer/src/Token.cpp index c1b4dbc..7296c9c 100644 --- a/Lexer/src/Token.cpp +++ b/Lexer/src/Token.cpp @@ -75,6 +75,8 @@ namespace LXC::Lexer TOKEN_TYPE_CASE(Token::Else); TOKEN_TYPE_CASE(Token::Return); + TOKEN_TYPE_CASE(Token::FunctionDef); + TOKEN_TYPE_CASE(Token::StringLiteral); TOKEN_TYPE_CASE(Token::NumLiteral); TOKEN_TYPE_CASE(Token::Identifier); @@ -86,6 +88,8 @@ namespace LXC::Lexer TOKEN_TYPE_CASE(Token::OpenBrace); TOKEN_TYPE_CASE(Token::CloseParen); TOKEN_TYPE_CASE(Token::OpenParen); + TOKEN_TYPE_CASE(Token::CloseCrocodile); + TOKEN_TYPE_CASE(Token::OpenCrocodile); TOKEN_TYPE_CASE(Token::Comma); TOKEN_TYPE_CASE(Token::End_of_file); diff --git a/examples/Fib.lx b/examples/Fib.lx index 8fecfcc..274b691 100644 --- a/examples/Fib.lx +++ b/examples/Fib.lx @@ -1,4 +1,4 @@ -int fib(int num) +func fib(int num) { # Base cases # if (n == 0) { return 0 } @@ -8,7 +8,7 @@ int fib(int num) return fib(n - 1) + fib(n - 2) } -int main(void) +func main(void) { int res = fib(8) return res == 21 diff --git a/examples/LawsOfMath.lx b/examples/LawsOfMath.lx index e81e235..7cce011 100644 --- a/examples/LawsOfMath.lx +++ b/examples/LawsOfMath.lx @@ -1,9 +1,9 @@ -int add(int a, int b) +func add(int a, int b) { return a + b } -int main(void) +func main(void) { int c = add(3, 4) if (c == 7) diff --git a/tests/src/LexerTests.cpp b/tests/src/LexerTests.cpp index 169bbb1..9f1254f 100644 --- a/tests/src/LexerTests.cpp +++ b/tests/src/LexerTests.cpp @@ -123,53 +123,59 @@ namespace LXC::Lexer Util::ReturnVal tokens = TokenizeFile(fileContents); Internal::ExpectTokens(tokens, { - Token::Identifier, // int - Token::Identifier, // add - Token::OpenParen, // ( - Token::Identifier, // int - Token::Identifier, // a - Token::Comma, // , - Token::Identifier, // int - Token::Identifier, // b - Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Return, // return - Token::Identifier, // a - Token::Add, // + - Token::Identifier, // b - Token::CloseBrace, // } + Token::FunctionDef, // func + Token::OpenCrocodile, // < + Token::Identifier, // int + Token::CloseCrocodile, // > + Token::Identifier, // add + Token::OpenParen, // ( + Token::Identifier, // int + Token::Identifier, // a + Token::Comma, // , + Token::Identifier, // int + Token::Identifier, // b + Token::CloseParen, // ) + Token::OpenBrace, // { + Token::Return, // return + Token::Identifier, // a + Token::Add, // + + Token::Identifier, // b + Token::CloseBrace, // } - Token::Identifier, // int - Token::Identifier, // main - Token::OpenParen, // ( - Token::Identifier, // void - Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Identifier, // int - Token::Identifier, // c - Token::Assign, // = - Token::Identifier, // add - Token::OpenParen, // ( - Token::NumLiteral, // 3 - Token::Comma, // , - Token::NumLiteral, // 4 - Token::CloseParen, // ) - Token::If, // if - Token::OpenParen, // ( - Token::Identifier, // c - Token::Eql, // == - Token::NumLiteral, // 7 - Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Return, // return - Token::NumLiteral, // 0 - Token::CloseBrace, // } - Token::Else, // else - Token::OpenBrace, // { - Token::Return, // return - Token::NumLiteral, // 1 - Token::CloseBrace, // } - Token::CloseBrace // } + Token::FunctionDef, // func + Token::OpenCrocodile, // < + Token::Identifier, // int + Token::CloseCrocodile, // > + Token::Identifier, // main + Token::OpenParen, // ( + Token::Identifier, // void + Token::CloseParen, // ) + Token::OpenBrace, // { + Token::Identifier, // int + Token::Identifier, // c + Token::Assign, // = + Token::Identifier, // add + Token::OpenParen, // ( + Token::NumLiteral, // 3 + Token::Comma, // , + Token::NumLiteral, // 4 + Token::CloseParen, // ) + Token::If, // if + Token::OpenParen, // ( + Token::Identifier, // c + Token::Eql, // == + Token::NumLiteral, // 7 + Token::CloseParen, // ) + Token::OpenBrace, // { + Token::Return, // return + Token::NumLiteral, // 0 + Token::CloseBrace, // } + Token::Else, // else + Token::OpenBrace, // { + Token::Return, // return + Token::NumLiteral, // 1 + Token::CloseBrace, // } + Token::CloseBrace // } }); } @@ -180,73 +186,79 @@ namespace LXC::Lexer Util::ReturnVal tokens = TokenizeFile(fileContents); Internal::ExpectTokens(tokens, { - Token::Identifier, // int - Token::Identifier, // fib - Token::OpenParen, // ( - Token::Identifier, // int - Token::Identifier, // num - Token::CloseParen, // ) - Token::OpenBrace, // { + Token::FunctionDef, // func + Token::OpenCrocodile, // < + Token::Identifier, // int + Token::CloseCrocodile, // > + Token::Identifier, // fib + Token::OpenParen, // ( + Token::Identifier, // int + Token::Identifier, // num + Token::CloseParen, // ) + Token::OpenBrace, // { - Token::If, // if - Token::OpenParen, // ( - Token::Identifier, // n - Token::Eql, // == - Token::NumLiteral, // 0 - Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Return, // return - Token::NumLiteral, // 0 - Token::CloseBrace, // } + Token::If, // if + Token::OpenParen, // ( + Token::Identifier, // n + Token::Eql, // == + Token::NumLiteral, // 0 + Token::CloseParen, // ) + Token::OpenBrace, // { + Token::Return, // return + Token::NumLiteral, // 0 + Token::CloseBrace, // } - Token::If, // if - Token::OpenParen, // ( - Token::Identifier, // n - Token::Eql, // == - Token::NumLiteral, // 1 - Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Return, // return - Token::NumLiteral, // 1 - Token::CloseBrace, // } + Token::If, // if + Token::OpenParen, // ( + Token::Identifier, // n + Token::Eql, // == + Token::NumLiteral, // 1 + Token::CloseParen, // ) + Token::OpenBrace, // { + Token::Return, // return + Token::NumLiteral, // 1 + Token::CloseBrace, // } - Token::Return, // return - Token::Identifier, // fib - Token::OpenParen, // ( - Token::Identifier, // n - Token::Sub, // - - Token::NumLiteral, // 1 - Token::CloseParen, // ) + Token::Return, // return + Token::Identifier, // fib + Token::OpenParen, // ( + Token::Identifier, // n + Token::Sub, // - + Token::NumLiteral, // 1 + Token::CloseParen, // ) - Token::Add, // + + Token::Add, // + - Token::Identifier, // fib - Token::OpenParen, // ( - Token::Identifier, // n - Token::Sub, // - - Token::NumLiteral, // 2 - Token::CloseParen, // ) - Token::CloseBrace, // } + Token::Identifier, // fib + Token::OpenParen, // ( + Token::Identifier, // n + Token::Sub, // - + Token::NumLiteral, // 2 + Token::CloseParen, // ) + Token::CloseBrace, // } - Token::Identifier, // int - Token::Identifier, // main - Token::OpenParen, // ( - Token::Identifier, // void - Token::CloseParen, // ) + Token::FunctionDef, // func + Token::OpenCrocodile, // < + Token::Identifier, // int + Token::CloseCrocodile, // > + Token::Identifier, // main + Token::OpenParen, // ( + Token::Identifier, // void + Token::CloseParen, // ) - Token::OpenBrace, // { - Token::Identifier, // int - Token::Identifier, // res - Token::Assign, // = - Token::Identifier, // fib - Token::OpenParen, // ( - Token::NumLiteral, // 8 - Token::CloseParen, // ) - Token::Return, // return - Token::Identifier, // res - Token::Eql, // == - Token::NumLiteral, // 21 - Token::CloseBrace // } + Token::OpenBrace, // { + Token::Identifier, // int + Token::Identifier, // res + Token::Assign, // = + Token::Identifier, // fib + Token::OpenParen, // ( + Token::NumLiteral, // 8 + Token::CloseParen, // ) + Token::Return, // return + Token::Identifier, // res + Token::Eql, // == + Token::NumLiteral, // 21 + Token::CloseBrace // } }); } }