Skip to content

Commit 87d56e5

Browse files
Merge pull request #22 from Pip-Install-Party/officialblake-develop
fix state twelve
2 parents 6b0d6ba + 3467e0a commit 87d56e5

File tree

2 files changed

+27
-54
lines changed

2 files changed

+27
-54
lines changed

tokenizer.cpp

Lines changed: 25 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,11 @@ void Tokenizer::state0(std::istringstream &inputStream, int &lineCount, std::ost
5151
buffer << "Token: " << ch << "\n";
5252
return state0(inputStream, lineCount, buffer);
5353
} else if (isdigit(ch)) {
54-
//state12(inputStream, lineCount, buffer);
55-
//************************************************** wasnt working plz help
56-
std::string number;
57-
number += ch;
58-
// Keep reading until a non-digit character is found.
59-
while (inputStream.get(ch) && ch != ' ' && ch != ';' && ch != ')' && ch != ']') {
60-
number += ch;
61-
}
62-
63-
inputStream.putback(ch); // Put back the last non-digit character.
64-
65-
// Check if the number is valid.
66-
if (!isValidInteger(number)) {
67-
std::cerr << "Syntax error on line " << lineCount << ": invalid integer\n";
68-
exit(1);
69-
}
70-
54+
inputStream.putback(ch);
7155
buffer << "\nToken type: INTEGER\n";
72-
buffer << "Token: " << number << "\n";
73-
//*****************************************************
56+
buffer << "Token: ";
57+
state12(inputStream, lineCount, buffer);
58+
buffer << "\n";
7459
return state0(inputStream, lineCount, buffer);
7560
} else if (ch == ',') {
7661
buffer << "\nToken type: COMMA\n";
@@ -117,7 +102,8 @@ void Tokenizer::state0(std::istringstream &inputStream, int &lineCount, std::ost
117102
} else if (ch == '\'') { // Found a single quote
118103
buffer << "\nToken type: SINGLE_QUOTE\n";
119104
buffer << "Token: " << ch << "\n"; // Add single quote to buffer
120-
return state5(inputStream, lineCount, buffer); // Check what the single quote is
105+
state5(inputStream, lineCount, buffer); // Check what the single quote is
106+
return state0(inputStream, lineCount, buffer);
121107
} else if (ch == '_') {
122108
buffer << "\nToken type: UNDERSCORE\n";
123109
buffer << "Token: " << ch << "\n";
@@ -233,7 +219,7 @@ void Tokenizer::state5(std::istringstream &inputStream, int &lineCount, std::ost
233219
} else if (ch == '\'') { // Check for the closing single quote (for empty single quotes) ** not sure if this should be accepted but I am for now **
234220
buffer << "\nToken type: SINGLE_QUOTE\n";
235221
buffer << "Token: ''\n"; // Handle empty character literal
236-
return state0(inputStream, lineCount, buffer);
222+
return;
237223
} else if (ch == '\\') { // Check for escaped characters
238224
state8(inputStream, lineCount, buffer); // Handle the esc character
239225
}
@@ -318,34 +304,26 @@ void Tokenizer::state11(std::istringstream &inputStream, int &lineCount, std::os
318304
if (ch == '\'') {
319305
buffer << "\nToken type: SINGLE_QUOTE\n";
320306
buffer << "Token: " << ch << "\n"; // Handle the final character
321-
return state0(inputStream, lineCount, buffer);
307+
return;
322308
} else {
323309
std::cerr << "Error: Invalid character literal\n";
324310
exit(1);
325311
}
312+
return;
326313
}
327314

328315
void Tokenizer::state12(std::istringstream &inputStream, int &lineCount, std::ostringstream& buffer) {
329316
char ch;
330317
inputStream.get(ch);
331-
inputStream.putback(ch);
332-
std::string number;
333-
number += ch;
334318
// Keep reading until a non-digit character is found.
335-
while (inputStream.get(ch) && ch != ' ' && ch != ';' && ch != ')' && ch != ']') {
336-
number += ch;
337-
}
338-
339-
inputStream.putback(ch); // Put back the last non-digit character.
340-
341-
// Check if the number is valid.
342-
if (!isValidInteger(number)) {
343-
std::cerr << "Syntax error on line " << lineCount << ": invalid integer\n";
344-
exit(1);
319+
if(!isdigit(ch)){
320+
inputStream.putback(ch);
321+
state14(inputStream, lineCount, buffer);
322+
return;
345323
}
346-
347-
buffer << "\nToken type: INTEGER\n";
348-
buffer << "Token: " << number << "\n";
324+
buffer << ch;
325+
state12(inputStream, lineCount, buffer);
326+
return;
349327
}
350328

351329
void Tokenizer::state13(std::istringstream &inputStream, int &lineCount, std::ostringstream& buffer) {
@@ -359,17 +337,16 @@ void Tokenizer::state13(std::istringstream &inputStream, int &lineCount, std::os
359337
buffer << "\nToken type: ASSIGNMENT_OPERATOR\n";
360338
buffer << "Token: =\n";
361339
}
362-
return state0(inputStream, lineCount, buffer);
340+
return;
363341
}
364342

365-
bool Tokenizer::isValidInteger(const std::string& token) {
366-
try {
367-
int value = std::stoi(token);
368-
return std::to_string(value) == token;
369-
} catch (const std::out_of_range& e) {
370-
return false;
371-
} catch (const std::invalid_argument& e) {
372-
return false;
343+
void Tokenizer::state14(std::istringstream &inputStream, int &lineCount, std::ostringstream& buffer) {
344+
char ch;
345+
inputStream.get(ch);
346+
if (ch != ' ' && ch != ';' && ch != ')' && ch != ']') {
347+
std::cerr << "Syntax error on line " << lineCount << ": invalid integer";
348+
exit(1);
373349
}
350+
inputStream.putback(ch);
351+
return;
374352
}
375-

tokenizer.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Tokenizer
1818
void state2(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
1919
void state3(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2020
void state4(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
21-
void state5(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer); // Handles character literals
21+
void state5(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2222
void state6(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2323
void state7(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2424
void state8(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
@@ -27,11 +27,7 @@ class Tokenizer
2727
void state11(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2828
void state12(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
2929
void state13(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
30-
31-
32-
33-
void error(const std::string &message, int lineCount);
34-
bool isValidInteger(const std::string &token);
30+
void state14(std::istringstream &inputStream, int &lineCount, std::ostringstream &buffer);
3531

3632
public:
3733
Tokenizer() {}

0 commit comments

Comments
 (0)