Lex program to recognize valid arithmetic expression and identify the identifiers and operators
Problem: Write a Lex program to recognize valid arithmetic expression and identify the identifiers and operators.
Explanation:
Flex (Fast lexical Analyzer Generator) is a tool/computer program for generating lexical analyzers (scanners or lexers) written by Vern Paxson in C around 1987. Lex reads an input stream specifying the lexical analyzer and outputs source code implementing the lexer in the C programming language. The function yylex() is the main flex function which runs the Rule Section.
Examples:
Input: a+b*c Output: valid expression the operators are : + * the identifiers are : a b c Input: a+b- Output: invalid expression Input: (a*b) Output: valid expression the operators are : * the identifiers are : a b Input: (a+b- Output: invalid expression
Implementation:
/* 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; } |
Output:
Please Login to comment...