%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
char identifiers[MAX][50];
int id_count = 0;
char operators[MAX][5];
int op_count = 0;
// Function to check if identifier/operator already stored
int is_present(char arr[][50], int count, char* token) {
for (int i=0; i<count; i++) {
if (strcmp(arr[i], token) == 0)
return 1;
}
return 0;
}
%}
%%
[ \t\n]+ ; // ignore whitespace
[a-zA-Z_][a-zA-Z0-9_]* {
if (!is_present(identifiers, id_count, yytext)) {
strcpy(identifiers[id_count++], yytext);
}
}
[+\-*/=()] {
if (!is_present(operators, op_count, yytext)) {
strcpy(operators[op_count++], yytext);
}
}
[0-9]+(\.[0-9]+)? ; // ignore numbers
. { printf("Invalid character: %s\n", yytext); exit(1); }
%%
int main() {
printf("Enter an arithmetic expression:\n");
yylex();
printf("\nIdentifiers found:\n");
for (int i=0; i<id_count; i++) {
printf("%s\n", identifiers[i]);
}
printf("\nOperators found:\n");
for (int i=0; i<op_count; i++) {
printf("%s\n", operators[i]);
}
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBNQVggMTAwMAoKY2hhciBpZGVudGlmaWVyc1tNQVhdWzUwXTsKaW50IGlkX2NvdW50ID0gMDsKCmNoYXIgb3BlcmF0b3JzW01BWF1bNV07CmludCBvcF9jb3VudCA9IDA7CgovLyBGdW5jdGlvbiB0byBjaGVjayBpZiBpZGVudGlmaWVyL29wZXJhdG9yIGFscmVhZHkgc3RvcmVkCmludCBpc19wcmVzZW50KGNoYXIgYXJyW11bNTBdLCBpbnQgY291bnQsIGNoYXIqIHRva2VuKSB7CiAgICBmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgewogICAgICAgIGlmIChzdHJjbXAoYXJyW2ldLCB0b2tlbikgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQolfQoKJSUKClsgXHRcbl0rICAgICAgICAgICA7ICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoKW2EtekEtWl9dW2EtekEtWjAtOV9dKiB7CiAgICBpZiAoIWlzX3ByZXNlbnQoaWRlbnRpZmllcnMsIGlkX2NvdW50LCB5eXRleHQpKSB7CiAgICAgICAgc3RyY3B5KGlkZW50aWZpZXJzW2lkX2NvdW50KytdLCB5eXRleHQpOwogICAgfQp9CgpbK1wtKi89KCldIHsKICAgIGlmICghaXNfcHJlc2VudChvcGVyYXRvcnMsIG9wX2NvdW50LCB5eXRleHQpKSB7CiAgICAgICAgc3RyY3B5KG9wZXJhdG9yc1tvcF9jb3VudCsrXSwgeXl0ZXh0KTsKICAgIH0KfQoKWzAtOV0rKFwuWzAtOV0rKT8gICA7IC8vIGlnbm9yZSBudW1iZXJzCgouICAgeyBwcmludGYoIkludmFsaWQgY2hhcmFjdGVyOiAlc1xuIiwgeXl0ZXh0KTsgZXhpdCgxKTsgfQoKJSUKCmludCBtYWluKCkgewogICAgcHJpbnRmKCJFbnRlciBhbiBhcml0aG1ldGljIGV4cHJlc3Npb246XG4iKTsKICAgIHl5bGV4KCk7CgogICAgcHJpbnRmKCJcbklkZW50aWZpZXJzIGZvdW5kOlxuIik7CiAgICBmb3IgKGludCBpPTA7IGk8aWRfY291bnQ7IGkrKykgewogICAgICAgIHByaW50ZigiJXNcbiIsIGlkZW50aWZpZXJzW2ldKTsKICAgIH0KCiAgICBwcmludGYoIlxuT3BlcmF0b3JzIGZvdW5kOlxuIik7CiAgICBmb3IgKGludCBpPTA7IGk8b3BfY291bnQ7IGkrKykgewogICAgICAgIHByaW50ZigiJXNcbiIsIG9wZXJhdG9yc1tpXSk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K