Open In App

DFA in LEX code which accepts Odd number of 0’s and even number of 1’s

Last Updated : 22 May, 2019
Improve
Improve
Like Article
Like
Save
Share
Report

Prerequisite: Designing Finite Automata
Problem: Design a LEX code to construct a DFA which accepts the language: all strings with Odd number of 0’s and even number of 1’s over inputs ‘0’ and ‘1’.

Examples:

Input: 10001 
Output: Accepted

Input: 10011
Output: Not Accepted

Input: asdf
Output: Invalid 

Approach:
LEX provides us with an INITIAL state by default. So in order to make a DFA, use this as the initial state of the DFA. Now we define four more states A, B, C and DEAD where DEAD state would be use if encounter a wrong or invalid input. When user input invalid character, move to DEAD state and print message “INVALID” and if input string ends at state B then display a message “Accepted”. If input string ends at state INITIAL, A, C then display a message “Not Accepted”. (Refer here).





Note:
To compile a lex program, user need a UNIX system and flex which can be installed using sudo apt-get install flex. With all the above specification open unix terminal and do the following:

  1. Use the lex program to change the specification file into a C language program. The resulting program is in the lex.yy.c file.
  2. Use the cc command with the -ll flag to compile and link the program with a library of LEX subroutines. The resulting executable program is in the a.out file.
lex lextest
cc lex.yy.c -lfl 

LEX Code:




%{
%}
  
%s A B C DEAD
  
%%
<INITIAL>1 BEGIN A;
<INITIAL>0 BEGIN B;
<INITIAL>[^01\n] BEGIN DEAD;
<INITIAL>\n BEGIN INITIAL; {printf("Not Accepted\n");}
  
<A>1 BEGIN INITIAL;
<A>0 BEGIN C;
<A>[^01\n] BEGIN DEAD;
<A>\n BEGIN INITIAL; {printf("Not Accepted\n");}
  
<B>1 BEGIN C;
<B>0 BEGIN INITIAL;
<B>[^01\n] BEGIN DEAD;
<B>\n BEGIN INITIAL; {printf("Accepted\n");} 
  
<C>1 BEGIN B;
<C>0 BEGIN A;
<C>[^01\n] BEGIN DEAD;
<C>\n BEGIN INITIAL; {printf("Not Accepted\n");} 
  
  
<DEAD>[^\n] BEGIN DEAD;
<DEAD>\n BEGIN INITIAL; {printf("Invalid\n");} 
  
%%
  
int main()
 {
    printf("Enter String\n");
    yylex();
    return 0;
 }


Output:


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads