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
       +