From 51f3bfd0e73d5e78d9fe71e6106a2a883619e18f Mon Sep 17 00:00:00 2001 From: rodri Date: Sat, 31 Aug 2024 16:06:55 +0000 Subject: stage 1. --- readme | 14 ++++++++++ s1/mkfile | 10 ++++++++ s1/rhoc.y | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 readme create mode 100644 s1/mkfile create mode 100644 s1/rhoc.y diff --git a/readme b/readme new file mode 100644 index 0000000..3faf396 --- /dev/null +++ b/readme @@ -0,0 +1,14 @@ +Welcome to rhoc, rodri's high-order calculator. This program is +already shipping with plan 9 so, in order to separate it from the +original, here is my version. + +I'm creating a folder per stage as it is explained in tupe [1], like +`s1', `s2', for stage one and two respectively. + +I also took the freedom to create the program my own way, so it's not +exactly as shown in the book, although it's got the same features. In +addition to UTF support (fuck you lex!) + + +References: +[1] The Unix Programming Environment, by Kernighan and Pike, 1984. diff --git a/s1/mkfile b/s1/mkfile new file mode 100644 index 0000000..ec4ce25 --- /dev/null +++ b/s1/mkfile @@ -0,0 +1,10 @@ + +#include +#include +#include + +Biobuf *bin; +int lineno; +int prompt; + +int yyparse(void); + +void +yyerror(char *msg) +{ + fprint(2, "%s at line %d\n", msg, lineno); +} + +int +yylex(void) +{ + int c; + + if(prompt){ + print("%d: ", lineno); + prompt--; + } + while((c = Bgetc(bin)) == ' ' || c == '\t') + ; + if(c == '.' || isdigit(c)){ + Bungetc(bin); + Bgetd(bin, &yylval); + return NUMBER; + } + if(c == '\n'){ + lineno++; + prompt++; + } + return c; +} + +void +usage(void) +{ + fprint(2, "usage: %s\n", argv0); + exits("usage"); +} + +void +main(int argc, char *argv[]) +{ + ARGBEGIN{ + default: usage(); + }ARGEND; + + if(argc > 0) + usage(); + bin = Bfdopen(0, OREAD); + if(bin == nil) + sysfatal("Bfdopen: %r"); + lineno++; + prompt++; + yyparse(); + Bterm(bin); + exits(0); +} -- cgit v1.2.3