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 */...Π’Π΅ΠΏΠ΅ΡΡ Π² Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ
asgnexprVAR = exprΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΡΡΡ. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΠΊΡΡΠ°ΡΠΈ, ΠΊΠ°ΠΊ ΠΌΡ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π² ΡΡΠ΅ΠΏΠ΅Π½Ρ, ΡΠ²Π»ΡΡΡΡΡΡΡ ΠΏΡΠ°Π²ΠΎΠ°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠΉ.
ΠΠ»Ρ ΡΡΠ΅ΠΊΠ°
yacc%unionSymbolhoc.hΠΠ΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΠΈΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠΌΠ΅Π½ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΎΡΠ½ΠΎΡΡΡΡΡ Π»ΠΈ ΠΎΠ½ΠΈ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ (
VARBLTINyylexPIVARΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠ²ΠΎΠΉΡΡΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π»ΠΈΠ±ΠΎ Π½Π΅ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ
yyparseVARxxx = 1ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Π°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ
yylexyylex() /* hoc3 */{Β ...Β if (isalpha(c)) {Β Symbol *s;Β char sbuf[100], *p = sbuf;Β do {Β Β *p++ = c;Β } while ((c=getchar()) != EOF && isalnum(c));Β ungetc(c, stdin);Β *p = '\0';Β if ((s=lookup(sbuf)) == 0)Β Β s = install(sbuf, UNDEF, 0.0);Β yylval.sym = s;Β return s->type == UNDEF ? VAR : s->type;Β }Β ...Π ΡΡΠ½ΠΊΡΠΈΠΈ
maininitPImain(argc, argv) /* hoc3 */Β char *argv[];{Β int fpecatch();Β progname = argv[0];Β init();Β setjmp(begin);Β signal(SIGFPE, fpecatch);Β yyparse();}Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΡΠ°Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»
math.Ρmath.Ρ<math.h><errno.h>$ cat math.Ρ#include <math.h>#include <errno.h>extern int errno;double errcheck();double Log(x)Β double x;{Β return errcheck(log(x), "log");}double Log10(x)Β double x;{Β return errcheck(log10(x), "log10");