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

назад