#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;
}
}
{
if (index > 0)
{
token[index] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); index = 0;
}
char next = input[i + 1];
if (strchr("+-*/=<>!", ch
) && next
== '=') {
token[0] = ch;
token[1] = '=';
token[2] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); i++;
}
else
{
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()
{
printf("Enter a simple C code snippet: "); char input[100] = "+= -= *= /= <= >= != ==";
lexicalAnalyzer(input);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBjaGFyIGxleGVtZVsxMDBdOwogICAgY2hhciB0eXBlWzIwXTsKfSBUb2tlbjsKCmNvbnN0IGNoYXIqIGtleXdvcmRzW10gPSB7ImludCIsICJmbG9hdCIsICJpZiIsICJlbHNlIiwgIndoaWxlIiwgInJldHVybiIsICJ2b2lkIiwgImNoYXIiLCAiZm9yIiwgImRvdWJsZSJ9Owpjb25zdCBpbnQgbnVtX2tleXdvcmRzID0gc2l6ZW9mKGtleXdvcmRzKSAvIHNpemVvZihrZXl3b3Jkc1swXSk7CgppbnQgaXNLZXl3b3JkKGNvbnN0IGNoYXIqIHRva2VuKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9rZXl3b3JkczsgaSsrKQogICAgewogICAgICAgIGlmIChzdHJjbXAodG9rZW4sIGtleXdvcmRzW2ldKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KClRva2VuIGNsYXNzaWZ5VG9rZW4oY29uc3QgY2hhciAqdG9rZW4pCnsKICAgIFRva2VuIHQ7CiAgICBzdHJjcHkodC5sZXhlbWUsIHRva2VuKTsKCiAgICBpZiAoaXNLZXl3b3JkKHRva2VuKSkKICAgICAgICBzdHJjcHkodC50eXBlLCAiS0VZV09SRCIpOwogICAgZWxzZSBpZiAoaXNkaWdpdCh0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIk5VTUJFUiIpOwogICAgZWxzZSBpZiAoaXNhbHBoYSh0b2tlblswXSkgfHwgdG9rZW5bMF0gPT0gJ18nKQogICAgICAgIHN0cmNweSh0LnR5cGUsICJJREVOVElGSUVSIik7CiAgICBlbHNlIGlmIChzdHJjaHIoIistKi89PD4hIiwgdG9rZW5bMF0pKQogICAgICAgIHN0cmNweSh0LnR5cGUsICJPUEVSQVRPUiIpOwogICAgZWxzZSBpZiAoc3RyY2hyKCI7KCkse30iLCB0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIkRFTElNSVRFUiIpOwogICAgZWxzZQogICAgICAgIHN0cmNweSh0LnR5cGUsICJVTktOT1dOIik7CgogICAgcmV0dXJuIHQ7Cn0KCnZvaWQgbGV4aWNhbEFuYWx5emVyKGNvbnN0IGNoYXIgKmlucHV0KQp7CiAgICBjaGFyIHRva2VuWzEwMF07CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RybGVuKGlucHV0KTsgaSsrKQogICAgewogICAgICAgIGNoYXIgY2ggPSBpbnB1dFtpXTsKCiAgICAgICAgaWYgKGlzc3BhY2UoY2gpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJjaHIoIistKi89PD4hIiwgY2gpIHx8IHN0cmNocigiOygpLHt9IiwgY2gpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2hhciBuZXh0ID0gaW5wdXRbaSArIDFdOwoKICAgICAgICAgICAgaWYgKHN0cmNocigiKy0qLz08PiEiLCBjaCkgJiYgbmV4dCA9PSAnPScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuWzBdID0gY2g7CiAgICAgICAgICAgICAgICB0b2tlblsxXSA9ICc9JzsKICAgICAgICAgICAgICAgIHRva2VuWzJdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuWzBdID0gY2g7CiAgICAgICAgICAgICAgICB0b2tlblsxXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBUb2tlbiB0ID0gY2xhc3NpZnlUb2tlbih0b2tlbik7CiAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgdC50eXBlLCB0LmxleGVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdG9rZW5baW5kZXgrK10gPSBjaDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGluZGV4ID4gMCkKICAgIHsKICAgICAgICB0b2tlbltpbmRleF0gPSAnXDAnOwogICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgdC50eXBlLCB0LmxleGVtZSk7CiAgICB9Cn0KCmludCBtYWluKCkKewogICBwcmludGYoIkVudGVyIGEgc2ltcGxlIEMgY29kZSBzbmlwcGV0OiAiKTsKICAgIGNoYXIgaW5wdXRbMTAwXSA9ICIrPSAtPSAqPSAvPSA8PSA+PSAhPSA9PSI7CiAgIAoKICAgIHByaW50ZigiXG5Ub2tlbnMgRm91bmQ6XG4iKTsKICAgIGxleGljYWxBbmFseXplcihpbnB1dCk7CgogICAgcmV0dXJuIDA7Cn0K