Initial commit for yacc shaving contest. - brcon2024-hackathons - Bitreichcon 2024 Hackathons
(HTM) git clone git://bitreich.org/brcon2024-hackathons git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/brcon2024-hackathons
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
---
(DIR) commit fe1953cc524f2263d68e4bd294c5c97364270469
(HTM) Author: Christoph Lohmann <20h@r-36.net>
Date: Wed, 12 Jun 2024 16:39:10 +0200
Initial commit for yacc shaving contest.
Diffstat:
A yacc-shaving/brainfuck/README.md | 11 +++++++++++
A yacc-shaving/brainfuck/brainfuck-e… | 2 ++
A yacc-shaving/brainfuck/brainfuck.l | 22 ++++++++++++++++++++++
A yacc-shaving/brainfuck/brainfuck.y | 45 +++++++++++++++++++++++++++++++
A yacc-shaving/brainfuck/makefile | 34 +++++++++++++++++++++++++++++++
5 files changed, 114 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/yacc-shaving/brainfuck/README.md b/yacc-shaving/brainfuck/README.md
@@ -0,0 +1,11 @@
+# Brainfuck Example
+
+This is a example to get the grasp on how yacc(1) and lex(1) interact.
+
+## Build Instructions
+
+ % make
+ % ./brainfuck < brainfuck-example.bf
+
+Have fun!
+
(DIR) diff --git a/yacc-shaving/brainfuck/brainfuck-example.bf b/yacc-shaving/brainfuck/brainfuck-example.bf
@@ -0,0 +1,2 @@
+[->+<]
+
(DIR) diff --git a/yacc-shaving/brainfuck/brainfuck.l b/yacc-shaving/brainfuck/brainfuck.l
@@ -0,0 +1,22 @@
+%{
+#include "y.tab.h"
+%}
+
+%%
+
+">" { return INCPTR; }
+"<" { return DECPTR; }
+"+" { return INCVAL; }
+"-" { return DECVAL; }
+"." { return OUTPUT; }
+"," { return INPUT; }
+"[" { return LOOPSTART; }
+"]" { return LOOPEND; }
+. { /* ignore any other character */ }
+
+%%
+
+int yywrap(void) {
+ return 1;
+}
+
(DIR) diff --git a/yacc-shaving/brainfuck/brainfuck.y b/yacc-shaving/brainfuck/brainfuck.y
@@ -0,0 +1,45 @@
+%{
+#include <stdio.h>
+
+void yyerror(const char *s);
+int yylex(void);
+
+%}
+
+%token INCPTR DECPTR INCVAL DECVAL OUTPUT INPUT LOOPSTART LOOPEND
+
+%%
+
+program:
+ /* empty */
+ | program command
+ ;
+
+command:
+ INCPTR { printf("Move pointer to the right\n"); }
+ | DECPTR { printf("Move pointer to the left\n"); }
+ | INCVAL { printf("Increment the value at the pointer\n"); }
+ | DECVAL { printf("Decrement the value at the pointer\n"); }
+ | OUTPUT { printf("Output the value at the pointer\n"); }
+ | INPUT { printf("Input a value and store it at the pointer\n"); }
+ | loop
+ ;
+
+loop:
+ LOOPSTART program LOOPEND
+ {
+ printf("Start of loop\n");
+ printf("End of loop\n");
+ }
+ ;
+
+%%
+
+void yyerror(const char *s) {
+ fprintf(stderr, "Error: %s\n", s);
+}
+
+int main(void) {
+ return yyparse();
+}
+
(DIR) diff --git a/yacc-shaving/brainfuck/makefile b/yacc-shaving/brainfuck/makefile
@@ -0,0 +1,34 @@
+CC = gcc
+LEX = lex
+YACC = yacc
+YACCFLAGS = -d
+
+TARGET = brainfuck
+LEX_SRC = brainfuck.l
+YACC_SRC = brainfuck.y
+LEX_GEN = lex.yy.c
+YACC_GEN = y.tab.c y.tab.h
+OBJ = y.tab.o lex.yy.o
+
+all: $(TARGET)
+
+$(TARGET): $(OBJ)
+ $(CC) -o $@ $^
+
+lex.yy.o: $(LEX_GEN)
+ $(CC) -c $< -o $@
+
+y.tab.o: y.tab.c
+ $(CC) -c $< -o $@
+
+$(LEX_GEN): $(LEX_SRC)
+ $(LEX) $<
+
+$(YACC_GEN): $(YACC_SRC)
+ $(YACC) $(YACCFLAGS) $<
+
+clean:
+ rm -f $(TARGET) $(OBJ) $(LEX_GEN) $(YACC_GEN)
+
+.PHONY: all clean
+