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

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:

filter_none

edit
close

play_arrow

link
brightness_4
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;
 }

chevron_right


Output:



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.