Автоматная программа распознавания последовательностей скобок произвольной глубины, реализующая смешанный автомат с реализацией входных и выходных воздействий внутри функции автомата
#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 ) { i = 0 ; }
else
if( c == '(' ) y0 = 1 ;
else
if( c == ')' ) y0 = 3 ;
break ;
case 1:
if( (i != 0) && (c == 0) || (i == 0) && (c == ')') ) y0 = 3 ;
else
if( (i == 0) && (c == 0) ) y0 = 2 ;
else
if( c == '(' ) { i++ ; }
else
if( c == ')' ) { i-- ; }
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:
i = 0 ;
break ;
case 1:
i++ ;
break ;
case 2:
printf( "
Допустить.
" ) ;
break ;
case 3:
printf( "
Отвергнуть.
" ) ;
break ;
}
}
назад