UNIX — универсальная среда программирования - Керниган Брайан Уилсон
На этом ресурсе Вы можете бесплатно читать книгу онлайн UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: ОС и Сети / Интернет . На сайте booksdaily.club Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
;cond: '(' expr ')' { code(STOP); $$ = $2; } ;while: WHILE { $$ = code3(whilecode, STOP, STOP); } ;if: IF { $$=code(ifcode); code3(STOP, STOP, STOP); } ;end: /* nothing */ { code(STOP); $$ = progp; } ;stmtlist: /* nothing */ { $$ = progp; } | stmtlist 'n' | stmtlist stmt ;expr: NUMBER { $$ = code2(constpush, (Inst)$1); } | VAR { $$ = code3(varpush, (Inst)$1, eval); } | asgn | BLTIN '(' expr ')' { $$ = $3; code2(bltin,(Inst)$1->u.ptr); } | '(' expr ')' { $$ = $2; } | expr '+' expr { code(add); } | expr '-' expr { code(sub); } | expr '*' expr { code(mul); } | expr '/' expr { code(div); } | expr '^' expr { code (power); } | '-' expr %prec UNARYMINUS { $$ = $2; code(negate); } | expr GT expr { code(gt); } | expr GE expr { code(ge); } | expr LT expr { code(lt); } | expr LE expr { code(le); } | expr EQ expr { code(eq); } | expr NE expr { code(ne); } | expr AND expr { code(and); } | expr OR expr { code(or); } | NOT expr { $$ = $2; code(not); } ;%%/* end of grammar */#include <stdio.h>#include <ctype.h>char *progname;int lineno = 1;#include <signal.h>#include <setjmp.h>jmp_buf begin;int defining;int c; /* global for use by warning() */yylex() /* hoc5 */{ while ((c=getchar()) == ' ' || c == 't') ; if (c == EOF) return 0; if (c == '.' || isdigit(c)) { /* number */ double d; ungetc(c, stdin); scanf("%lf", &d); yylval.sym = install("", NUMBER, d); return NUMBER; } if (isalpha(c)) { Symbol *s; char sbuf[100], *p = sbuf; do *p++ = c; while ((c=getchar()) != EOF && isalnum(c)); ungetc(c, stdin); *p = ' '; if ((s=lookup(sbuf)) == 0) s = install(sbuf, UNDEF, 0.0); yylval.sym = s; return s->type == UNDEF ? VAR : s->type; } switch (c) { case '>': return follow('=', GE, GT); case '<': return follow('=', LE, LT); case '=': return follow('=', EQ, '='); case '!': return follow('=', NE, NOT); case '|': return follow('|', OR, '|'); case '&': return follow('&', AND, '&'); case 'n': lineno++; return 'n'; default: return c; }}follow(expect, ifyes, ifno) /* look ahead for >=, etc. */{ int c = getchar(); if (c == expect) return ifyes; ungetc(c, stdin); return ifno;}yyerror(s) char *s;{ warning(s, (char*)0);}execerror(s, t) /* recover from run-time error */ char *s, *t;{ warning(s, t); longjmp(begin, 0);}fpecatch() /* catch floating point exceptions */{ execerror("floating point exception", (char*)0);}main(argc, argv) char *argv[];{