Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

%right '='

%left '+' '-'

%left '*' '/'

%left UNARYMINUS

%right '^' /* exponentiation */

%%

list: /* nothing */

 | list '\n'

 | list asgn '\n'

 | list expr '\n' { printf("\t%.8g\n", $2); }

 | list error '\n' { yyerrok; }

 ;

asgn: VAR '=' expr { $$=$1->u.val=$3; $1->type = VAR; }

 ;

expr: NUMBER

 | VAR {

if ($1->type == UNDEF)

execerror("undefined variable", $1->name);

$$ = $1->u.val;

 }

 | asgn

 | BLTIN '(' expr ')' { $$ = (*($1->u.ptr))($3); }

 | expr '+' expr { $$ = $1 + $3; }

 | expr '+' expr { $$ = $1 - $3; }

 | expr '*' expr { $$ = $1 * $3; }

 | expr '/' expr {

if ($3 == 0.0)

execerror("division by zero", "");

$$ = $1 / $3;

 }

 | expr '^' expr { $$ = Pow($1, $3); }

 | '(' expr ')' { $$ = $2; }

 | '-' expr %prec UNARYMINUS { $$ = -$2; }

 ;

%%

/* end of grammar */

#include <stdio.h>

#include <ctype.h>

char *progname;

int lineno = 1;

#include <setjmp.h>

jmp_buf begin;

main(argc, argv) /* hoc3 */

 char *argv[];

{

 progname = argv[0];

 init;

 setjmp(begin);

 yyparse;

}

yyerror(s)

 char *s;

{

 warning(s, (char *)0);

}

execerror(s, t)

 char *s, *t;

{

 warning(s, t);

 longjmp(begin, 0);

}

warning(s, t)

 char *s, *t;

{

 fprintf (stderr, "%s: %s", progname, s);

 if (t && *t)

fprintf(stderr, " %s", t);

 fprintf(stderr, " near line %d\n", lineno);

}

3.4.3

init.c

#include "hoc.h"

#include "y.tab.h"

#include <math.h>

extern double Log, Log10, Exp, Sqrt, integer;

static struct { /* Constants */

 char *name;

 double eval;

} consts [] = {

 "PI", 3.14159265358979323846,

 "E", 2.71828182845904523536,

 "GAMMA", 0.57721566490153286060, /* Euler */

 "DEG", 57.29577951308232087680, /* deg/radian */

 "PHI", 1.61803398874989484820, /* golden ratio */

 0, 0

};

static struct { /* Built-ins */

 char *name;

 double (*func);

} builtins[] = {

 "sin", sin,

 "cos", cos,

 "atan", atan,

 "log", Log, /* checks argument */

 "log10", Log10, /* checks argument */

 "exp", Exp, /* checks argument */

 "sqrt", Sqrt, /* checks argument */

 "int", integer,

 "abs", fabs,

 0, 0

};

init /* install constants and built-ins in table */

{

 int i;

 Symbol *s;

 for (i = 0; consts[i].name; i++)

install(consts[i].name, VAR, consts[i].eval);

 for (i = 0; builtins[i].name; i++) {

s = install(builtins[i].name, BLTIN, 0.0);

s->u.ptr = builtins[i].func;

 }

}

3.4.4.

lex.l

%{

#include "hoc.h"

#include "y.tab.h"

extern int lineno;

%}

%%

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец