Что такое 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 мы ставили
перед собой две основные задачи:
-
Обеспечить возможность построения мультисинтаксических компиляторов, когда
в результирующем исполняемом файле необходимо иметь не один, а несколько
различных анализаторов (в последней версии byacc
сделана лишь примитивная попытка достижения этой цели, посредством макроопределений
препроцессора языка C).
-
Обеспечить возможность работы на русском языке (мы не ориентировались на
компилятор языка C, который может воспринимать
идентификаторы и ключевые слова лишь в ASCII
кодах, а готовили средство для создания собственных языков программирования).
Решение данных задач воплотилось в последней версии программы ZUBR.
Пока данная программа работает в среде MS Windows.
Планируется ее перенос в Linux, тем более
что сделать это элементарно, тормозит работу только желание обеспечить
ее независимость от версий glibc (как известно,
для программиста крайне важно вовремя остановиться).
В связи с этим, мы хотели бы попросить Вас присылать свои отзывы о программе
ZUBR (kx@peterlink.ru),
и если данная программа окажется нужной, мы продолжим работу над ней и
обеспечим выход новых версий для платформ Linux и
MS Windows.
Краткое
описание программы ZUBR скорее
предназначено для опытных пользователей. Для тех, кто впервые столкнулся
с необходимостью написания собственного интерпретатора или компилятора
советуем посмотреть книгу
|
Костельцев А.В. Построение интерпретаторов и компиляторов. Использование
программ bison, byacc, zubr. – СПб.: Наука и техника, 2001. – 224 с.
|
В ней Вы найдете:
-
общие принципы взаимодействия составных частей компиляторов;
-
практические примеры создания лексических, синтаксических и семантических
анализаторов;
-
простые примеры организации таблиц символов и внутреннего представления
программ как на основе польской записи, так и в виде тетрад;
-
множество реально работающих программ, развитие которых ограничено только
Вашей фантазией.
Кроме того, на прилагаемом к книге CD-ROM Вы найдете средства создания
программ, переносимых на уровне исходных кодов, для операционных систем
Linux и MS Windows
и, естественно:
-
примеры программ приведенные в книге,
-
генератор синтаксических анализаторов ZUBR
и руководство по его использованию в HTML-формате,
-
продукт Cygwin-1.1.8, который можно назвать
системой UNIX в среде Била Гейтса: bash,
gcc, bison,
byacc, и другие утилиты среды UNIX,
а также справочная информация (общий объем более 500 Мб).
Андрей В.Костельцев.
E-mail: kx@peterlink.ru