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

назад