Автоматная программа распознавания последовательностей скобок произвольной глубины, реализующая смешанный автомат
#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 )
{
int y_old = y0 ;
switch( y0 )
{
case 0:
if( e == 0 ) { z1_0() ; }
else
if( x2(c) ) y0 = 1 ;
else
if( x3(c) ) y0 = 3 ;
break ;
case 1:
if( !x1() && x4(c) || x1() && x3(c) ) y0 = 3 ;
else
if( x1() && x4(c) ) y0 = 2 ;
else
if( x2(c) ) { z1_1() ; }
else
if( x3(c) ) { z1_2() ; }
break ;
case 2:
if( e == 0 ) y0 = 0 ;
break ;
case 3:
if( e == 0 ) y0 = 0 ;
break ;
}
if( y_old == y0 ) return ;
switch( y0 )
{
case 0:
z1_0() ;
break ;
case 1:
z1_1() ;
break ;
case 2:
z2_0() ;
break ;
case 3:
z2_1() ;
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( "
Отвергнуть.
" ) ; }
назад