/* Lex program to recognize valid arithmetic expression
and identify the identifiers and operators */
%{
#include <stdio.h>
#include <string.h>
int operators_count = 0, operands_count = 0, valid = 1, top = -1, l = 0, j = 0;
char operands[10][10], operators[10][10], stack[100];
%}
%%
"(" {
top++;
stack[top] = '(';
}
"{" {
top++;
stack[top] = '{';
}
"[" {
top++;
stack[top] = '[';
}
")" {
if (stack[top] != '(') {
valid = 0;
}
else if(operands_count>0 && (operands_count-operators_count)!=1){
valid=0;
}
else{
top--;
operands_count=1;
operators_count=0;
}
}
"}" {
if (stack[top] != '{') {
valid = 0;
}
else if(operands_count>0 && (operands_count-operators_count)!=1){
valid=0;
}
else{
top--;
operands_count=1;
operators_count=0;
}
}
"]" {
if (stack[top] != '[') {
valid = 0;
}
else if(operands_count>0 && (operands_count-operators_count)!=1){
valid=0;
}
else{
top--;
operands_count=1;
operators_count=0;
}
}
"+"|"-"|"*"|"/" {
operators_count++;
strcpy(operators[l], yytext);
l++;
}
[0-9]+|[a-zA-Z][a-zA-Z0-9_]* {
operands_count++;
strcpy(operands[j], yytext);
j++;
}
%%
int yywrap()
{
return 1;
}
int main()
{
int k;
printf("Enter the arithmetic expression: ");
yylex();
if (valid == 1 && top == -1) {
printf("\nValid Expression\n");
}
else
printf("\nInvalid Expression\n");
return 0;
}
LyogTGV4IHByb2dyYW0gdG8gcmVjb2duaXplIHZhbGlkIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAKCQlhbmQgaWRlbnRpZnkgdGhlIGlkZW50aWZpZXJzIGFuZCBvcGVyYXRvcnMgKi8KJXsgCiNpbmNsdWRlIDxzdGRpby5oPiAKI2luY2x1ZGUgPHN0cmluZy5oPiAKCWludCBvcGVyYXRvcnNfY291bnQgPSAwLCBvcGVyYW5kc19jb3VudCA9IDAsIHZhbGlkID0gMSwgdG9wID0gLTEsIGwgPSAwLCBqID0gMDsgCgljaGFyIG9wZXJhbmRzWzEwXVsxMF0sIG9wZXJhdG9yc1sxMF1bMTBdLCBzdGFja1sxMDBdOyAKJX0gCiUlIAoiKCIgeyAKCXRvcCsrOyAKCXN0YWNrW3RvcF0gPSAnKCc7IAp9IAoieyIgeyAKCXRvcCsrOyAKCXN0YWNrW3RvcF0gPSAneyc7IAp9IAoiWyIgeyAKCXRvcCsrOyAKCXN0YWNrW3RvcF0gPSAnWyc7IAp9IAoiKSIgeyAKCWlmIChzdGFja1t0b3BdICE9ICcoJykgeyAKCQl2YWxpZCA9IDA7CSAKCX0gCgllbHNlIGlmKG9wZXJhbmRzX2NvdW50PjAgJiYgKG9wZXJhbmRzX2NvdW50LW9wZXJhdG9yc19jb3VudCkhPTEpeyAKCQl2YWxpZD0wOyAKCX0gCgllbHNleyAKCQl0b3AtLTsgCgkJb3BlcmFuZHNfY291bnQ9MTsgCgkJb3BlcmF0b3JzX2NvdW50PTA7IAoJfSAKfSAKIn0iIHsgCglpZiAoc3RhY2tbdG9wXSAhPSAneycpIHsgCgkJdmFsaWQgPSAwOwkgCgl9IAoJZWxzZSBpZihvcGVyYW5kc19jb3VudD4wICYmIChvcGVyYW5kc19jb3VudC1vcGVyYXRvcnNfY291bnQpIT0xKXsgCgkJdmFsaWQ9MDsgCgl9IAoJZWxzZXsgCgkJdG9wLS07IAoJCW9wZXJhbmRzX2NvdW50PTE7IAoJCW9wZXJhdG9yc19jb3VudD0wOyAKCX0gCn0gCiJdIiB7IAoJaWYgKHN0YWNrW3RvcF0gIT0gJ1snKSB7IAoJCXZhbGlkID0gMDsgCgl9IAoJZWxzZSBpZihvcGVyYW5kc19jb3VudD4wICYmIChvcGVyYW5kc19jb3VudC1vcGVyYXRvcnNfY291bnQpIT0xKXsgCgkJdmFsaWQ9MDsgCgl9IAoJZWxzZXsgCgkJdG9wLS07IAoJCW9wZXJhbmRzX2NvdW50PTE7IAoJCW9wZXJhdG9yc19jb3VudD0wOyAKCX0gCgkJCn0gCiIrInwiLSJ8IioifCIvIiB7IAoJb3BlcmF0b3JzX2NvdW50Kys7IAoJc3RyY3B5KG9wZXJhdG9yc1tsXSwgeXl0ZXh0KTsgCglsKys7IAp9IApbMC05XSt8W2EtekEtWl1bYS16QS1aMC05X10qIHsgCglvcGVyYW5kc19jb3VudCsrOyAKCXN0cmNweShvcGVyYW5kc1tqXSwgeXl0ZXh0KTsgCglqKys7IAp9IAolJSAKCgppbnQgeXl3cmFwKCkgCnsgCglyZXR1cm4gMTsgCn0gCmludCBtYWluKCkgCnsgCglpbnQgazsgCglwcmludGYoIkVudGVyIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb246ICIpOyAKCXl5bGV4KCk7IAoKCWlmICh2YWxpZCA9PSAxICYmIHRvcCA9PSAtMSkgeyAKCQlwcmludGYoIlxuVmFsaWQgRXhwcmVzc2lvblxuIik7IAoJfSAKCWVsc2UKCQlwcmludGYoIlxuSW52YWxpZCBFeHByZXNzaW9uXG4iKTsgCgoJcmV0dXJuIDA7IAp9IAo=