@@ -10,6 +10,7 @@ void Lexer::advance()
1010 } else {
1111 _currentChar = _text[_pos];
1212 }
13+ ++_parsingPosition;
1314}
1415
1516void Lexer::skipWhitespace ()
@@ -19,6 +20,19 @@ void Lexer::skipWhitespace()
1920 }
2021}
2122
23+ void Lexer::skipNewLine ()
24+ {
25+ ++_pos;
26+ if (_pos > static_cast <int >(_text.length ()) - 1 ) {
27+ _currentChar = ' \0 ' ;
28+ } else {
29+ _currentChar = _text[_pos];
30+ }
31+
32+ ++_parsingLine;
33+ _parsingPosition = 0 ;
34+ }
35+
2236std::variant<int , float , bool > Lexer::number ()
2337{
2438 std::string result;
@@ -48,94 +62,79 @@ Token Lexer::getNextToken()
4862 if (_currentChar == ' ' ) {
4963 skipWhitespace ();
5064 continue ;
51- }
52- if (_currentChar == ' +' ) {
65+ } else if (_currentChar == ' \n ' ) {
66+ skipNewLine ();
67+ continue ;
68+ } else if (_currentChar == ' +' ) {
5369 advance ();
5470 return Token (' +' , TokenType::PLUS);
55- }
56- if (_currentChar == ' -' ) {
71+ } else if (_currentChar == ' -' ) {
5772 advance ();
5873 return Token (' -' , TokenType::MINUS);
59- }
60- if (_currentChar == ' *' ) {
74+ } else if (_currentChar == ' *' ) {
6175 advance ();
6276 return Token (' *' , TokenType::MULTIPLICATION);
63- }
64- if (_currentChar == ' /' ) {
77+ } else if (_currentChar == ' /' ) {
6578 advance ();
6679 return Token (' /' , TokenType::DIVISION);
67- }
68- if (_currentChar == ' =' && peekNextChar () == ' =' ) {
80+ } else if (_currentChar == ' =' && peekNextChar () == ' =' ) {
6981 advance ();
7082 advance ();
7183 return Token (" ==" , TokenType::COMPARISON);
72- }
73- if (_currentChar == ' !' && peekNextChar () == ' =' ) {
84+ } else if (_currentChar == ' !' && peekNextChar () == ' =' ) {
7485 advance ();
7586 advance ();
7687 return Token (" !=" , TokenType::NOT_EQUAL);
77- }
78- if (_currentChar == ' >' && peekNextChar () == ' =' ) {
88+ } else if (_currentChar == ' >' && peekNextChar () == ' =' ) {
7989 advance ();
8090 advance ();
8191 return Token (" >=" , TokenType::GREATER_EQUAL);
82- }
83- if (_currentChar == ' <' && peekNextChar () == ' =' ) {
92+ } else if (_currentChar == ' <' && peekNextChar () == ' =' ) {
8493 advance ();
8594 advance ();
8695 return Token (" <=" , TokenType::LESS_EQUAL);
87- }
88- if (_currentChar == ' >' ) {
96+ } else if (_currentChar == ' >' ) {
8997 advance ();
9098 advance ();
9199 return Token (" >" , TokenType::GREATER);
92- }
93- if (_currentChar == ' <' ) {
100+ } else if (_currentChar == ' <' ) {
94101 advance ();
95102 advance ();
96103 return Token (" <" , TokenType::LESS);
97- }
98- if (_currentChar == ' (' ) {
104+ } else if (_currentChar == ' (' ) {
99105 advance ();
100106 return Token (' (' , TokenType::LPAREN);
101- }
102- if (_currentChar == ' )' ) {
107+ } else if (_currentChar == ' )' ) {
103108 advance ();
104109 return Token (' )' , TokenType::RPAREN);
105- }
106- if (_currentChar == ' =' ) {
110+ } else if (_currentChar == ' =' ) {
107111 advance ();
108112 return Token (' =' , TokenType::ASSIGN);
109- }
110- if (_currentChar == ' :' ) {
113+ } else if (_currentChar == ' :' ) {
111114 advance ();
112115 return Token (' :' , TokenType::COLON);
113- }
114- if (_currentChar == ' ;' ) {
116+ } else if (_currentChar == ' ;' ) {
115117 advance ();
116118 return Token (' ;' , TokenType::SEMICOLON);
117- }
118- if (_currentChar == ' .' ) {
119+ } else if (_currentChar == ' .' ) {
119120 advance ();
120121 return Token (' .' , TokenType::DOT);
121- }
122- if (_currentChar == ' ,' ) {
122+ } else if (_currentChar == ' ,' ) {
123123 advance ();
124124 return Token (' ,' , TokenType::COMMA);
125- }
126- if (isdigit (_currentChar)) {
125+ } else if (isdigit (_currentChar)) {
127126 std::variant<int , float , bool > num = number ();
128127 if (std::holds_alternative<int >(num)) {
129128 return Token (std::get<int >(num), TokenType::INTEGER);
130129 } else {
131130 return Token (std::get<float >(num), TokenType::FLOATING_NUMBER);
132131 }
133- }
134- if (isalpha (_currentChar)) {
132+ } else if (isalpha (_currentChar)) {
135133 return id ();
136- }
134+ } else {
137135
138- raiseInvalidCharacterError ();
136+ raiseInvalidCharacterError ();
137+ }
139138 }
140139
141140 return Token (std::nullptr_t (), TokenType::END_OF_FILE);
0 commit comments