Автоматная программа распознавания последовательностей скобок произвольной глубины, реализующая смешанный автомат с реализацией входных и выходных воздействий внутри функции автомата
#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 ;
  } 
}

назад