Автоматная программа распознавания последовательностей скобок произвольной глубины, реализующая автомат Мили
#include
#include
int y0 = 0 ; // Переменная состояния автомата
int i = 0 ; // Счетчик единиц
void main()
{
char str[100] = ?? ;
int j ;
for(;;)
{
printf( ?
Введите строку: ? ) ;
scanf( ?%s?, str ) ;
printf( ?Введена строка: %s?, str ) ;
A0( 0, 0 ) ;
for( j = 0 ; j <= strlen(str) ; j++ )
A0( 1, str[j] ) ;
}
}
void A0( int e, char c )
{
switch( y0 )
{
case 0:
if( x2(c) ) { z1_1() ; y0 = 1 ; }
else
if( x3(c) ) { z2_1() ; y0 = 3 ; }
else
if( e == 0 ) { z1_0() ; }
break ;
case 1:
if( !x1() && x4(c) || x1() && x3(c) ) { z2_1() ; y0 = 3 ; }
else
if( x1() && x4(c) ) { z2_0() ; y0 = 2 ; }
else
if( x2(c) ) { z1_1() ; }
else
if( x3(c) ) { z1_2() ; }
break ;
case 2:
if( e == 0 ) { z1_0() ; y0 = 0 ; }
break ;
case 3:
if( e == 0 ) { z1_0() ; y0 = 0 ; }
break ;
}
}
int x1()
{ return i == 0 ; }
int x2( char c )
{ return c == ?(? ; }
int x3( char c )
{ return c == ?)? ; }
int x4( char c )
{ return c == 0 ; }
void z1_0()
{ i = 0 ; }
void z1_1()
{ i++ ; }
void z1_2()
{ i— ; }
void z2_0()
{ printf( ?
Допустить.
? ) ; }
void z2_1()
{ printf( ?
Отвергнуть.
? ) ; }
назад