#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
char ch, str[20];
FILE *fp = fopen("input.c", "r");
if (!fp) return 1;
while ((ch = fgetc(fp)) != EOF) {
if (isalpha(ch)) { // identifier or keyword
int i = 0;
str[i++] = ch;
while (isalnum(ch = fgetc(fp))) str[i++] = ch;
str[i] = '\0';
fseek(fp, -1, SEEK_CUR);
printf("Identifier: %s\n", str);
}
else if (isdigit(ch)) { // constant
int i = 0;
str[i++] = ch;
while (isdigit(ch = fgetc(fp)) || ch == '.') str[i++] = ch;
str[i] = '\0';
fseek(fp, -1, SEEK_CUR);
printf("Constant: %s\n", str);
}
else if (ch == '/' && (ch = fgetc(fp)) == '/') { // single-line comment
printf("Comment: //");
while ((ch = fgetc(fp)) != '\n') putchar(ch);
printf("\n");
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '=')
printf("Operator: %c\n", ch);
}
fclose(fp);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQgbWFpbigpIHsKICAgIGNoYXIgY2gsIHN0clsyMF07CiAgICBGSUxFICpmcCA9IGZvcGVuKCJpbnB1dC5jIiwgInIiKTsKICAgIGlmICghZnApIHJldHVybiAxOwoKICAgIHdoaWxlICgoY2ggPSBmZ2V0YyhmcCkpICE9IEVPRikgewogICAgICAgIGlmIChpc2FscGhhKGNoKSkgeyAvLyBpZGVudGlmaWVyIG9yIGtleXdvcmQKICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICBzdHJbaSsrXSA9IGNoOwogICAgICAgICAgICB3aGlsZSAoaXNhbG51bShjaCA9IGZnZXRjKGZwKSkpIHN0cltpKytdID0gY2g7CiAgICAgICAgICAgIHN0cltpXSA9ICdcMCc7CiAgICAgICAgICAgIGZzZWVrKGZwLCAtMSwgU0VFS19DVVIpOwogICAgICAgICAgICBwcmludGYoIklkZW50aWZpZXI6ICVzXG4iLCBzdHIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc2RpZ2l0KGNoKSkgeyAvLyBjb25zdGFudAogICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgIHN0cltpKytdID0gY2g7CiAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGNoID0gZmdldGMoZnApKSB8fCBjaCA9PSAnLicpIHN0cltpKytdID0gY2g7CiAgICAgICAgICAgIHN0cltpXSA9ICdcMCc7CiAgICAgICAgICAgIGZzZWVrKGZwLCAtMSwgU0VFS19DVVIpOwogICAgICAgICAgICBwcmludGYoIkNvbnN0YW50OiAlc1xuIiwgc3RyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJy8nICYmIChjaCA9IGZnZXRjKGZwKSkgPT0gJy8nKSB7IC8vIHNpbmdsZS1saW5lIGNvbW1lbnQKICAgICAgICAgICAgcHJpbnRmKCJDb21tZW50OiAvLyIpOwogICAgICAgICAgICB3aGlsZSAoKGNoID0gZmdldGMoZnApKSAhPSAnXG4nKSBwdXRjaGFyKGNoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA9PSAnKycgfHwgY2ggPT0gJy0nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnLycgfHwgY2ggPT0gJz0nKQogICAgICAgICAgICBwcmludGYoIk9wZXJhdG9yOiAlY1xuIiwgY2gpOwogICAgfQoKICAgIGZjbG9zZShmcCk7CiAgICByZXR1cm4gMDsKfQo=