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:
- Use the lex program to change the specification file into a C language program. The resulting program is in the lex.yy.c file.
- 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: