#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;
}
}
else if (strchr("+-*/=<>!", ch
)) {
if (index > 0)
{
token[index] = '\0';
Token t = classifyToken(token);
printf("%s: %s\n", t.
type, t.
lexeme); index = 0;
}
if (input[i+1] == '=')
{
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 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+CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgY2hhciBsZXhlbWVbMTAwXTsKICAgIGNoYXIgdHlwZVsyMF07Cn0gVG9rZW47CgoKY29uc3QgY2hhcioga2V5d29yZHNbXSA9IHsiaW50IiwiZmxvYXQiLCJpZiIsImVsc2UiLCJ3aGlsZSIsInJldHVybiIsInZvaWQiLCJjaGFyIiwiZm9yIiwiZG91YmxlIn07CmNvbnN0IGludCBudW1fa2V5d29yZHMgPSBzaXplb2Yoa2V5d29yZHMpIC8gc2l6ZW9mKGtleXdvcmRzWzBdKTsKCgppbnQgaXNLZXl3b3JkKGNvbnN0IGNoYXIqIHRva2VuKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9rZXl3b3JkczsgaSsrKQogICAgewogICAgICAgIGlmIChzdHJjbXAodG9rZW4sIGtleXdvcmRzW2ldKSA9PSAwKQogICAgICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgoKVG9rZW4gY2xhc3NpZnlUb2tlbihjb25zdCBjaGFyICp0b2tlbikKewogICAgVG9rZW4gdDsKICAgIHN0cmNweSh0LmxleGVtZSwgdG9rZW4pOwoKICAgIGlmIChpc0tleXdvcmQodG9rZW4pKQogICAgICAgIHN0cmNweSh0LnR5cGUsICJLRVlXT1JEIik7CgogICAgZWxzZSBpZiAoaXNkaWdpdCh0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIk5VTUJFUiIpOwoKICAgIGVsc2UgaWYgKGlzYWxwaGEodG9rZW5bMF0pIHx8IHRva2VuWzBdID09ICdfJykKICAgICAgICBzdHJjcHkodC50eXBlLCAiSURFTlRJRklFUiIpOwoKICAgIGVsc2UgaWYgKHN0cmNocigiKy0qLz08PiEiLCB0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIk9QRVJBVE9SIik7CgogICAgZWxzZSBpZiAoc3RyY2hyKCI7KCkse30iLCB0b2tlblswXSkpCiAgICAgICAgc3RyY3B5KHQudHlwZSwgIkRFTElNSVRFUiIpOwoKICAgIGVsc2UKICAgICAgICBzdHJjcHkodC50eXBlLCAiVU5LTk9XTiIpOwoKICAgIHJldHVybiB0Owp9CgoKdm9pZCBsZXhpY2FsQW5hbHl6ZXIoY29uc3QgY2hhciAqaW5wdXQpCnsKICAgIGNoYXIgdG9rZW5bMTAwXTsKICAgIGludCBpbmRleCA9IDA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJsZW4oaW5wdXQpOyBpKyspCiAgICB7CiAgICAgICAgY2hhciBjaCA9IGlucHV0W2ldOwoKICAgICAgICAKICAgICAgICBpZiAoaXNzcGFjZShjaCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaW5kZXggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbltpbmRleF0gPSAnXDAnOwogICAgICAgICAgICAgICAgVG9rZW4gdCA9IGNsYXNzaWZ5VG9rZW4odG9rZW4pOwogICAgICAgICAgICAgICAgcHJpbnRmKCIlczogJXNcbiIsIHQudHlwZSwgdC5sZXhlbWUpOwogICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAKICAgICAgICBlbHNlIGlmIChzdHJjaHIoIistKi89PD4hIiwgY2gpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpbnB1dFtpKzFdID09ICc9JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5bMF0gPSBjaDsKICAgICAgICAgICAgICAgIHRva2VuWzFdID0gJz0nOwogICAgICAgICAgICAgICAgdG9rZW5bMl0gPSAnXDAnOwoKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKCiAgICAgICAgICAgICAgICBpKys7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5bMF0gPSBjaDsKICAgICAgICAgICAgICAgIHRva2VuWzFdID0gJ1wwJzsKCiAgICAgICAgICAgICAgICBUb2tlbiB0ID0gY2xhc3NpZnlUb2tlbih0b2tlbik7CiAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgdC50eXBlLCB0LmxleGVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIAogICAgICAgIGVsc2UgaWYgKHN0cmNocigiOygpLHt9IiwgY2gpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFRva2VuIHQgPSBjbGFzc2lmeVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB0LnR5cGUsIHQubGV4ZW1lKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdG9rZW5bMF0gPSBjaDsKICAgICAgICAgICAgdG9rZW5bMV0gPSAnXDAnOwoKICAgICAgICAgICAgVG9rZW4gdCA9IGNsYXNzaWZ5VG9rZW4odG9rZW4pOwogICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgdC50eXBlLCB0LmxleGVtZSk7CiAgICAgICAgfQoKICAgICAgICAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0b2tlbltpbmRleCsrXSA9IGNoOwogICAgICAgIH0KICAgIH0KCiAgICAKICAgIGlmIChpbmRleCA+IDApCiAgICB7CiAgICAgICAgdG9rZW5baW5kZXhdID0gJ1wwJzsKICAgICAgICBUb2tlbiB0ID0gY2xhc3NpZnlUb2tlbih0b2tlbik7CiAgICAgICAgcHJpbnRmKCIlczogJXNcbiIsIHQudHlwZSwgdC5sZXhlbWUpOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGNoYXIgaW5wdXRbMjAwXTsKCiAgICBwcmludGYoIkVudGVyIGEgc2ltcGxlIEMgY29kZSBzbmlwcGV0OiAiKTsKICAgIGZnZXRzKGlucHV0LCBzaXplb2YoaW5wdXQpLCBzdGRpbik7CgogICAgcHJpbnRmKCJcblRva2VucyBGb3VuZDpcbiIpOwogICAgbGV4aWNhbEFuYWx5emVyKGlucHV0KTsKCiAgICByZXR1cm4gMDsKfQ==