#include <stdio.h>
#include <string.h>
#include <ctype.h>
void tokenize(const char *input)
{
int i = 0;
while (i < len)
{
// Skip whitespace
{
i++;
continue;
}
// Check for two-character operators
if (i + 1 < len)
{
char two[3] = {input[i], input[i + 1], '\0'};
{
printf("OPERATOR: %s\n", two
); i += 2;
continue;
}
}
// Single-character operators
if (input[i] == '+' || input[i] == '-' || input[i] == '*' ||
input[i] == '/' || input[i] == '=' || input[i] == '>' ||
input[i] == '<' || input[i] == '!')
{
printf("OPERATOR: %c\n", input
[i
]); i++;
continue;
}
// Identifiers / keywords
if (isalpha(input
[i
]) || input
[i
] == '_') {
char buffer[256];
int j = 0;
while (i
< len
&& (isalnum(input
[i
]) || input
[i
] == '_')) {
buffer[j++] = input[i++];
}
buffer[j] = '\0';
printf("IDENTIFIER: %s\n", buffer
); continue;
}
// Numbers
{
char buffer[256];
int j = 0;
while (i
< len
&& isdigit(input
[i
])) {
buffer[j++] = input[i++];
}
buffer[j] = '\0';
printf("NUMBER: %s\n", buffer
); continue;
}
// Unknown character
printf("UNKNOWN: %c\n", input
[i
]); i++;
}
}
int main()
{
char input[1024];
printf("Enter a simple C code snippet: "); fgets(input
, sizeof(input
), stdin
);
// Remove trailing newline
input
[strcspn(input
, "\n")] = '\0';
tokenize(input);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+Cgp2b2lkIHRva2VuaXplKGNvbnN0IGNoYXIgKmlucHV0KQp7CiAgICBpbnQgaSA9IDA7CiAgICBpbnQgbGVuID0gc3RybGVuKGlucHV0KTsKCiAgICBwcmludGYoIlxuVG9rZW5zIEZvdW5kOlxuIik7CgogICAgd2hpbGUgKGkgPCBsZW4pCiAgICB7CiAgICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlCiAgICAgICAgaWYgKGlzc3BhY2UoaW5wdXRbaV0pKQogICAgICAgIHsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciB0d28tY2hhcmFjdGVyIG9wZXJhdG9ycwogICAgICAgIGlmIChpICsgMSA8IGxlbikKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgdHdvWzNdID0ge2lucHV0W2ldLCBpbnB1dFtpICsgMV0sICdcMCd9OwoKICAgICAgICAgICAgaWYgKHN0cmNtcCh0d28sICIrPSIpID09IDAgfHwgc3RyY21wKHR3bywgIi09IikgPT0gMCB8fAogICAgICAgICAgICAgICAgc3RyY21wKHR3bywgIio9IikgPT0gMCB8fCBzdHJjbXAodHdvLCAiLz0iKSA9PSAwIHx8CiAgICAgICAgICAgICAgICBzdHJjbXAodHdvLCAiPj0iKSA9PSAwIHx8IHN0cmNtcCh0d28sICI8PSIpID09IDAgfHwKICAgICAgICAgICAgICAgIHN0cmNtcCh0d28sICI9PSIpID09IDAgfHwgc3RyY21wKHR3bywgIiE9IikgPT0gMCkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIHByaW50ZigiT1BFUkFUT1I6ICVzXG4iLCB0d28pOwogICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFNpbmdsZS1jaGFyYWN0ZXIgb3BlcmF0b3JzCiAgICAgICAgaWYgKGlucHV0W2ldID09ICcrJyB8fCBpbnB1dFtpXSA9PSAnLScgfHwgaW5wdXRbaV0gPT0gJyonIHx8CiAgICAgICAgICAgIGlucHV0W2ldID09ICcvJyB8fCBpbnB1dFtpXSA9PSAnPScgfHwgaW5wdXRbaV0gPT0gJz4nIHx8CiAgICAgICAgICAgIGlucHV0W2ldID09ICc8JyB8fCBpbnB1dFtpXSA9PSAnIScpCiAgICAgICAgewoKICAgICAgICAgICAgcHJpbnRmKCJPUEVSQVRPUjogJWNcbiIsIGlucHV0W2ldKTsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIElkZW50aWZpZXJzIC8ga2V5d29yZHMKICAgICAgICBpZiAoaXNhbHBoYShpbnB1dFtpXSkgfHwgaW5wdXRbaV0gPT0gJ18nKQogICAgICAgIHsKICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICAgICAgICAgaW50IGogPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiAoaXNhbG51bShpbnB1dFtpXSkgfHwgaW5wdXRbaV0gPT0gJ18nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBpbnB1dFtpKytdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1ZmZlcltqXSA9ICdcMCc7CiAgICAgICAgICAgIHByaW50ZigiSURFTlRJRklFUjogJXNcbiIsIGJ1ZmZlcik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gTnVtYmVycwogICAgICAgIGlmIChpc2RpZ2l0KGlucHV0W2ldKSkKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CiAgICAgICAgICAgIGludCBqID0gMDsKICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgaXNkaWdpdChpbnB1dFtpXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gaW5wdXRbaSsrXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWZmZXJbal0gPSAnXDAnOwogICAgICAgICAgICBwcmludGYoIk5VTUJFUjogJXNcbiIsIGJ1ZmZlcik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gVW5rbm93biBjaGFyYWN0ZXIKICAgICAgICBwcmludGYoIlVOS05PV046ICVjXG4iLCBpbnB1dFtpXSk7CiAgICAgICAgaSsrOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGNoYXIgaW5wdXRbMTAyNF07CiAgICBwcmludGYoIkVudGVyIGEgc2ltcGxlIEMgY29kZSBzbmlwcGV0OiAiKTsKICAgIGZnZXRzKGlucHV0LCBzaXplb2YoaW5wdXQpLCBzdGRpbik7CgogICAgLy8gUmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUKICAgIGlucHV0W3N0cmNzcG4oaW5wdXQsICJcbiIpXSA9ICdcMCc7CgogICAgdG9rZW5pemUoaW5wdXQpOwogICAgcmV0dXJuIDA7Cn0=