Сайт Информационных Технологий

Каталог >> ИИ >> Технологии управления

Что такое ZUBR?

[Download: zubr_prog.zip - два варианта программы zubr для MS Windows (single_byte и UNICODE)]

Пользователи открытых UNIX систем давно знакомы с такими программами как bison и byacc. Данные программы позволяют строить синтаксические анализаторы по, заданной пользователем грамматике.

Например, для построения простого калькулятора, работающего в командной строке, достаточно составить грамматику:
 
%{ 
#include <math.h> 
#define ZUBR_STYPE double 
%} 

%token <val>   NUMBER 
%left '+' '-'   /* left associative, same precedence */ 
%left '*' '/'   /* left associative, higher precedence */ 
%left UNARYMINUS 
%right '^'      /* power */ 
%% 
list:    /* nothing */ 
       | list '\n'         { printf( "$ " ); } 
       | list expr '\n'    { printf( "\t%.8g\n", $2 ); printf( "$ " );  } 
       | list error '\n'      {  printf( "$ " );            zubr_errok;     } 
       ; 

expr:    NUMBER 
       | expr '+' expr             { $$ = $1 + $3; } 
       | expr '-' expr             { $$ = $1 - $3; } 
       | expr '*' expr             { $$ = $1 * $3; } 
       | expr '/' expr             { $$ = $1 / $3; } 
       | expr '^' expr             { $$ = pow( $1, $3 ); } 
       | '(' expr ')'              { $$ =  $2; } 
       | '-' expr %prec UNARYMINUS { $$ = -$2; } 
       ; 
%% 
 

написать лексический анализатор и функцию main():
 
char *progname; 
int   lineno = 1; 

void warning( char *s, char *t ) 
{ 
   fprintf( stderr, "%s: %s", progname, s ); 
   if( t ) fprintf( stderr, " %s", t ); 
   fprintf( stderr, " near line %d\n", lineno ); 
} 

void zubr_error( char *s ) { warning( s, (char *)0 ); } 

int zubr_lex( void ) 
{ 
   int c; 

   while( (c=getchar()) == ' ' || c == '\t' ) 
   ; 
   if( c == '\0' ) return( 0 ); 
   if( c == '.' || isdigit( c ) ) 
   { 
      /* number */ 
      ungetc( c, stdin ); 
      scanf( "%lf", &zubr_lval.val ); 
      return( NUMBER ); 
   } 
   if( c == '\n' ) lineno++; 

   return( c ); 
} 
  

int main( int argc, char *argv[] ) 
{ 
   progname = argv[0]; 

   printf( "$ " ); 

   zubr_parse(); 

   return( 0 ); 
} 
 

поместить все это, например, в файл main.y и выполнить следующие команды:
 
$ zubr -Cmain.c main.y 
$ gcc main.c -o main 
 

Готовая программа main.exe будет читать из стандартного потока ввода выражения и выдавать Вам результаты вычислений.
 

Первым генератором синтаксических анализаторов, которому удалось завоевать популярность, был yacc (yet another compiler-compiler), написанный С.Джонсоном в 1972 году.  С тех пор код программы yacc претерпел незначительные изменения и программы, созданные на его принципах популярны до сих пор. Например, с помощью программы bison построен компилятор GCC, являющийся самым распространенным открытым C-компилятором.

Последний, известный нам, алгоритм на котором основываются подобные генераторы синтаксических анализаторов принадлежит Тому Пеннелло и Франку ДеРемеру (TOPLAS Vol 4, Number 4, October 1982, Thomas J. Pennello, Frank DeRemer, Efficient Computation of LALR(1) Look-Ahead Sets. 615-649), именно этот алгоритм использовался при построении ZUBR.

При разработке программы ZUBR мы ставили перед собой две основные задачи:

Решение данных задач воплотилось в последней версии программы ZUBR. Пока данная программа работает в среде MS Windows. Планируется ее перенос в Linux, тем более что сделать это элементарно, тормозит работу только желание обеспечить ее независимость от версий glibc (как известно, для программиста крайне важно вовремя остановиться).

В связи с этим, мы хотели бы попросить Вас присылать свои отзывы о программе ZUBR (kx@peterlink.ru), и если данная программа окажется нужной, мы продолжим работу над ней и обеспечим выход новых версий для платформ Linux и MS Windows.
 

Краткое описание программы ZUBR  скорее предназначено для опытных пользователей. Для тех, кто впервые столкнулся с необходимостью написания собственного интерпретатора или компилятора советуем посмотреть книгу
 
 
    Костельцев А.В. Построение интерпретаторов и компиляторов. Использование программ bison, byacc, zubr. – СПб.: Наука и техника, 2001. – 224 с.
 

В ней Вы найдете:

Кроме того, на прилагаемом к книге CD-ROM Вы найдете средства создания программ, переносимых на уровне исходных кодов, для операционных систем Linux и MS Windows и, естественно:  
 
 
Андрей В.Костельцев.
E-mail: kx@peterlink.ru

Site of Information Technologies
Designed by  inftech@webservis.ru.