}3.1.3
hoc1.y%{#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]; yyparse();}yylex() /* hoc1 */{ int c; while ((c=getchar()) == ' ' || с == '\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) char *s;{ warning(s, (char *)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.2
hoc23.2.1
hoc.y%{double mem[26]; /* memory for variables 'a'..'z' */%}%union { /* stack type */ double val; /* actual value */ int index; /* index into mem[] */}%token <val> NUMBER%token <index> VAR%type <val> expr%right '='%left '+' '-'%left '*' '/'%left UNARYMINUS%%list: /* nothing */ | list '\n' | list expr '\n' { printf("\t%.8g\n\ $2); } | list error '\n' { yyerrok; } ;expr: NUMBER | VAR { $$ = mem[$1]; } | VAR '=' expr { $$ = mem[$1] = $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 ')' { $$ = $2; } | '-' expr %prec UNARYMINUS { $$ = -$2; } ;%%/* end of grammar */#include <stdio.h>#include <ctype.h>char *progname;int lineno = 1;#include <signal.h>#include <setjmp.h>jmp_buf begin;main(argc, argv) /* hoc2 */ char *argv[];{