Книги онлайн » Книги » Компьютеры и Интернет » Интернет » UNIX — универсальная среда программирования - Керниган Брайан Уилсон
Перейти на страницу:

 | FUNCTION

 | PROCEDURE

 ;

arglist: /* nothing */ { $$ = 0; }

 | expr { $$ = 1; }

 | arglist expr { $$ = $1 + 1; }

 ;

%%

/* end of grammar */

#include <stdio.h>

#include <ctype.h>

char *progname;

int lineno = 1;

#include <signal.h>

#include <setjmp.h>

jmp_buf begin;

int indef;

char *infile; /* input file name */

FILE *fin; /* input file pointer */

char **gargv; /* global argument list */

int gargc;

int c; /* global for use by warning() */

yylex() /* hoc6 */

{

 while ((c=getc(fin)) == ' ' || c == 't')

  ;

 if (c == EOF)

  return 0;

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

  double d;

  ungetc(c, fin);

  fscanf(fin, "%lf", &d);

  yylval.sym = install("", NUMBER, d);

  return NUMBER;

 }

 if (isalpha(c)) {

  Symbol *s;

  char sbuf[100], *p = sbuf;

  do {

   if (p >= sbuf + sizeof(sbuf) - 1) {

    *p = '';

    execerror("name too long", sbuf);

   }

   *p++ = c;

  } while ((c=getc(fin)) != EOF && isalnum(c));

  ungetc(c, fin);

  *p = '';

  if ((s=lookup(sbuf)) == 0)

   s = install(sbuf, UNDEF, 0.0);

  yylval.sym = s;

  return s->type == UNDEF ? VAR : s->type;

 }

 if (c == '$') { /* argument? */

  int n = 0;

  while (isdigit(c=getc(fin)))

   n=10*n+c- '0';

  ungetc(c, fin);

  if (n == 0)

   execerror("strange $...", (char*)0);

  yylval.narg = n;

  return ARG;

 }

 if (c == '"') { /* quoted string */

  char sbuf[100], *p, *emalloc();

  for (p = sbuf; (c=getc(fin)) != '"'; p++) {

   if (с == 'n' || c == EOF)

    execerror("missing quote", "");

   if (p >= sbuf + sizeof(sbuf) - 1) {

    *p = '';

    execerror("string too long", sbuf);

   }

   *p = backslash(c);

  }

  *p = 0;

  yylval.sym = (Symbol*)emalloc(strlen(sbuf)+1);

  strcpy(yylval.sym, sbuf);

  return STRING;

 }

 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;

 }

}

backslash(c) /* get next char with 's interpreted */

 int c;

{

 char *index(); /* 'strchr()' in some systems */

 static char transtab[] = "bbffnnrrtt";

 if (c != '\')

  return c;

 с = getc(fin);

 if (islower(c) && index(transtab, c))

  return index(transtab, с)[1];

 return c;

}

follow(expect, ifyes, ifno) /* look ahead for >=, etc. */

{

 int с = getc(fin);

 if (c == expect)

  return ifyes;

 ungetc(c, fin);

 return ifno;

Перейти на страницу:
В нашей электронной библиотеке 📖 можно онлайн читать бесплатно книгу UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: Интернет. Электронная библиотека онлайн дает возможность читать всю книгу целиком без регистрации и СМС на нашем литературном сайте kniga-online.com. Так же в разделе жанры Вы найдете для себя любимую 👍 книгу, которую сможете читать бесплатно с телефона📱 или ПК💻 онлайн. Все книги представлены в полном размере. Каждый день в нашей электронной библиотеке Кniga-online.com появляются новые книги в полном объеме без сокращений. На данный момент на сайте доступно более 100000 книг, которые Вы сможете читать онлайн и без регистрации.
Комментариев (0)