#include <stdio.h>
#include <ctype.h>
#include <string.h>
typedef struct {
char lexeme[100];
char type[20];
} Token;
const char* keywords[] = {"int", "float", "if", "else", "while", "return", "void", "char", "for", "double"};
const int num_keywords = sizeof(keywords) / sizeof(keywords[0]);
int isKeyword(const char* token) {
for (int i = 0; i < num_keywords; i++) {
if (strcmp(token
, keywords
[i
]) == 0) return 1; }
return 0;
}
Token classifyToken(const char *token) {
Token t;
if (isKeyword(token))
else if (isalpha(token
[0]) || token
[0] == '_') else if (strchr("+-*/=<>!", token
[0])) else if (strchr(";(),{}", token
[0])) else
return t;
}
void lexicalAnalyzer(const char *input) {
char token[100];
int index = 0;
for (int i
= 0; i
< strlen(input
); i
++) { char ch = input[i];
if (index > 0) {
token[index] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); index = 0;
}
}
// Multi-character operators check
else if ((ch == '+' && input[i+1] == '=') ||
(ch == '-' && input[i+1] == '=') ||
(ch == '*' && input[i+1] == '=') ||
(ch == '/' && input[i+1] == '=') ||
(ch == '=' && input[i+1] == '=') ||
(ch == '!' && input[i+1] == '=') ||
(ch == '>' && input[i+1] == '=') ||
(ch == '<' && input[i+1] == '=')) {
token[0] = ch;
token[1] = input[i+1];
token[2] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); i++; // skip next char
}
// Single-character operators or delimiters
else if (strchr("+-*/=<>!;(),{}", ch
)) { if (index > 0) {
token[index] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); index = 0;
}
token[0] = ch;
token[1] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); }
else {
token[index++] = ch;
}
}
if (index > 0) {
token[index] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); }
}
int main() {
char input[200];
printf("Enter a simple C code snippet: "); fgets(input
, sizeof(input
), stdin
);
lexicalAnalyzer(input);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIGxleGVtZVsxMDBdOwogICAgY2hhciB0eXBlWzIwXTsKfSBUb2tlbjsKCmNvbnN0IGNoYXIqIGtleXdvcmRzW10gPSB7ImludCIsICJmbG9hdCIsICJpZiIsICJlbHNlIiwgIndoaWxlIiwgInJldHVybiIsICJ2b2lkIiwgImNoYXIiLCAiZm9yIiwgImRvdWJsZSJ9Owpjb25zdCBpbnQgbnVtX2tleXdvcmRzID0gc2l6ZW9mKGtleXdvcmRzKSAvIHNpemVvZihrZXl3b3Jkc1swXSk7CgppbnQgaXNLZXl3b3JkKGNvbnN0IGNoYXIqIHRva2VuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9rZXl3b3JkczsgaSsrKSB7CiAgICAgICAgaWYgKHN0cmNtcCh0b2tlbiwga2V5d29yZHNbaV0pID09IDApIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KClRva2VuIGNsYXNzaWZ5VG9rZW4oY29uc3QgY2hhciAqdG9rZW4pIHsKICAgIFRva2VuIHQ7CiAgICBzdHJjcHkodC5sZXhlbWUsIHRva2VuKTsKCiAgICBpZiAoaXNLZXl3b3JkKHRva2VuKSkKICAgICAgICBzdHJjcHkodC50eXBlLCAiS0VZV09SRCIpOwogICAgZWxzZSBpZiAoaXNkaWdpdCh0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIk5VTUJFUiIpOwogICAgZWxzZSBpZiAoaXNhbHBoYSh0b2tlblswXSkgfHwgdG9rZW5bMF0gPT0gJ18nKQogICAgICAgIHN0cmNweSh0LnR5cGUsICJJREVOVElGSUVSIik7CiAgICBlbHNlIGlmIChzdHJjaHIoIistKi89PD4hIiwgdG9rZW5bMF0pKQogICAgICAgIHN0cmNweSh0LnR5cGUsICJPUEVSQVRPUiIpOwogICAgZWxzZSBpZiAoc3RyY2hyKCI7KCkse30iLCB0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIkRFTElNSVRFUiIpOwogICAgZWxzZQogICAgICAgIHN0cmNweSh0LnR5cGUsICJVTktOT1dOIik7CgogICAgcmV0dXJuIHQ7Cn0KCnZvaWQgbGV4aWNhbEFuYWx5emVyKGNvbnN0IGNoYXIgKmlucHV0KSB7CiAgICBjaGFyIHRva2VuWzEwMF07CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RybGVuKGlucHV0KTsgaSsrKSB7CiAgICAgICAgY2hhciBjaCA9IGlucHV0W2ldOwoKICAgICAgICBpZiAoaXNzcGFjZShjaCkpIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNdWx0aS1jaGFyYWN0ZXIgb3BlcmF0b3JzIGNoZWNrCiAgICAgICAgZWxzZSBpZiAoKGNoID09ICcrJyAmJiBpbnB1dFtpKzFdID09ICc9JykgfHwKICAgICAgICAgICAgICAgICAoY2ggPT0gJy0nICYmIGlucHV0W2krMV0gPT0gJz0nKSB8fAogICAgICAgICAgICAgICAgIChjaCA9PSAnKicgJiYgaW5wdXRbaSsxXSA9PSAnPScpIHx8CiAgICAgICAgICAgICAgICAgKGNoID09ICcvJyAmJiBpbnB1dFtpKzFdID09ICc9JykgfHwKICAgICAgICAgICAgICAgICAoY2ggPT0gJz0nICYmIGlucHV0W2krMV0gPT0gJz0nKSB8fAogICAgICAgICAgICAgICAgIChjaCA9PSAnIScgJiYgaW5wdXRbaSsxXSA9PSAnPScpIHx8CiAgICAgICAgICAgICAgICAgKGNoID09ICc+JyAmJiBpbnB1dFtpKzFdID09ICc9JykgfHwKICAgICAgICAgICAgICAgICAoY2ggPT0gJzwnICYmIGlucHV0W2krMV0gPT0gJz0nKSkgewogICAgICAgICAgICB0b2tlblswXSA9IGNoOwogICAgICAgICAgICB0b2tlblsxXSA9IGlucHV0W2krMV07CiAgICAgICAgICAgIHRva2VuWzJdID0gJ1wwJzsKICAgICAgICAgICAgVG9rZW4gdCA9IGNsYXNzaWZ5VG9rZW4odG9rZW4pOwogICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgdC50eXBlLCB0LmxleGVtZSk7CiAgICAgICAgICAgIGkrKzsgLy8gc2tpcCBuZXh0IGNoYXIKICAgICAgICB9CiAgICAgICAgLy8gU2luZ2xlLWNoYXJhY3RlciBvcGVyYXRvcnMgb3IgZGVsaW1pdGVycwogICAgICAgIGVsc2UgaWYgKHN0cmNocigiKy0qLz08PiE7KCkse30iLCBjaCkpIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0b2tlblswXSA9IGNoOwogICAgICAgICAgICB0b2tlblsxXSA9ICdcMCc7CiAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgcHJpbnRmKCIlczogJXNcbiIsIHQudHlwZSwgdC5sZXhlbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdG9rZW5baW5kZXgrK10gPSBjaDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIHRva2VuW2luZGV4XSA9ICdcMCc7CiAgICAgICAgVG9rZW4gdCA9IGNsYXNzaWZ5VG9rZW4odG9rZW4pOwogICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBjaGFyIGlucHV0WzIwMF07CiAgICBwcmludGYoIkVudGVyIGEgc2ltcGxlIEMgY29kZSBzbmlwcGV0OiAiKTsKICAgIGZnZXRzKGlucHV0LCBzaXplb2YoaW5wdXQpLCBzdGRpbik7CgogICAgcHJpbnRmKCJcblRva2VucyBGb3VuZDpcbiIpOwogICAgbGV4aWNhbEFuYWx5emVyKGlucHV0KTsKCiAgICByZXR1cm4gMDsKfQo=