Вход/Регистрация
UNIX — универсальная среда программирования
вернуться

Керниган Брайан Уилсон

Шрифт:

3.1.1

makefile

hoc1: hoc.o

cc hoc.o -o hoc1

3.1.2

hoc.y

%{

#define YYSTYPE double /* data type of yacc stack */

%}

%token NUMBER

%left '+' /* left associative, same precedence */

%left '*' '/' /* left assoc., higher precedence */

%%

list : /* nothing */

 | list '\n'

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

 ;

expr: NUMBER { $$ = $1; }

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

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

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

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

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

 ;

%%

/* end of grammar */

#include <stdio.h>

#include <ctype.h>

char *progname; /* for error messages */

int lineno = 1;

main(argc, argv) /* hoc1 */

 char *argv[];

{

 progname = argv[0];

 yyparse;

}

yylex /* hoc1 */

{

 int c;

 while ((c=getchar) == ' ' || c == '\t')

;

 if (c == EOF)

return 0;

 if (c == '.' || isdigit(c)) { /* number */

ungetc(c, stdin);

 scanf("%lf", &yylval);

 return NUMBER;

 if (c == '\n')

lineno++;

 return c;

}

yyerror(s) /* called for yacc syntax error */

 char *s;

{

 warning(s, (char*)0);

}

warning(s, t) /* print warning message */

 char *s, *t;

{

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

 if (t)

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

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

}

3.1.3

hoc1.y
, версия 1.5

%{

#define YYSTYPE double /* data type of yacc stack */

%}

%token NUMBER

%left '-' '+'

%left '*' '/'

%left UNARYMINUS

%%

list: /* nothing */

 | list '\n'

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

 ;

expr: NUMBER { $$ = $1; }

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

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

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

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

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

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

 ;

%%

/* end of grammar */

#include <stdio.h>

#include <ctype.h>

char *progname; /* for error messages */

int lineno = 1;

main(argc, argv) /* hoc1 */

 char *argv[];

{

 progname = argv[0];

  • Читать дальше
  • 1
  • ...
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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