diff --git a/day_2/Makefile b/day_2/Makefile new file mode 100644 index 0000000..922249d --- /dev/null +++ b/day_2/Makefile @@ -0,0 +1,54 @@ +CC := clang +YACC := bison +LEX := flex +CFLAGS := -std=c17 -Wpedantic -Wall -Wextra +BUILD := ./build +INCLUDE := -I./ +OBJ_DIR := $(BUILD)/objects +APP_DIR := $(BUILD)/bin +TARGET := day_2 + +SRC := $(wildcard ./*.cpp) lexer.c parser.c + +OBJECTS := $(SRC:%.c=$(OBJ_DIR)/%.o) + +# targets +all: build $(APP_DIR)/$(TARGET) + +run: all + $(APP_DIR)/$(TARGET) + +flex: + $(LEX) --outfile=lexer.c --header-file=lexer.h lexer.l + +bison: + $(YACC) --output=parser.c parser.y + +generate: flex bison + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< + +$(APP_DIR)/$(TARGET): flex bison $(OBJECTS) + @mkdir -p $(@D) + $(CC) $(CFLAGS) $(INCLUDE) $(LDFLAGS) -o $(APP_DIR)/$(TARGET) $(OBJECTS) + +.PHONY: all build clean debug release + +build: + @mkdir -p $(APP_DIR) + @mkdir -p $(OBJ_DIR) + +debug: CFLAGS += -DDEBUG -g +debug: all + +sanitize: CFLAGS += -DDEBUG -g -fsanitize=address +sanitize: all + +release: CFLAGS += -O2 +release: all + +clean: + -@rm -rvf $(BUILD) + -@rm -rvf {lexer.c,parser.c} {lexer.h,parser.h} diff --git a/day_2/input.txt b/day_2/input.txt new file mode 100644 index 0000000..20e0cef --- /dev/null +++ b/day_2/input.txt @@ -0,0 +1,2500 @@ +C Y +C X +A Z +B X +B Z +C X +C X +B Z +C X +B Z +C X +C X +A X +C Y +A X +C Y +B Y +C X +C Y +B Z +A X +C X +B X +B X +B Z +A Z +C Z +B Z +B Z +C X +B Z +C X +B Z +B Z +C X +C Y +B Z +C Y +A Z +B Y +C X +C Y +A Z +B Z +B Z +C X +C Y +B X +B Z +A X +B X +A X +B Z +C Y +C Y +A X +C X +C X +B X +A Z +C Y +C X +B Z +A Z +C Y +B X +C Y +B Z +C X +B X +B Z +B Z +C Z +B Y +C Y +B Y +A Z +A X +A Y +A Y +C Y +C X +C X +B Z +B X +C X +B Z +A Z +C Y +C Z +C Z +B X +B Z +C Y +A Y +A X +C X +B Z +B Y +B X +B Z +B Z +A X +C Y +C Y +C X +A X +B Z +A Z +A X +B Z +C X +C Z +C Z +C Y +C Z +B Z +C Z +C Y +B Z +A X +C Y +B X +C Y +B Z +C Y +A Z +A X +B Z +A X +A Y +B Z +C X +C Y +C Y +B Z +B Z +A Z +C X +A Z +A X +A Z +B Z +B X +A Z +B Z +B Y +C X +C Y +C X +C X +A Z +A Z +C Y +B Z +C Y +B X +C Y +C Y +B Z +C X +B Z +A Z +C Y +C Y +B Z +A X +C X +B Z +C X +B Y +A Y +C X +B X +C Y +B Z +C Z +C X +C Z +B Z +B Y +A X +A Z +B Z +A Z +C X +A X +C X +C Y +C Z +A Z +B Z +B X +B X +A Y +B Y +C Y +B Y +B Z +A X +A Y +A Z +B X +B Z +C Z +C Z +B Z +C Y +C Y +C X +C X +B Z +B Z +C Y +A Z +C X +C Y +A Y +A X +B Z +C Z +C X +C X +C X +A Z +C Y +B Z +B Z +C X +C Y +C Z +B Z +C Y +A X +A Z +A Z +C Y +A X +B Z +C Y +C X +C X +B Z +C Z +B Z +B Z +B X +A Z +C Y +C Y +C X +B Z +B Y +B Z +B Z +C Y +A X +A Y +C Y +A X +C Y +C Z +A Y +A X +B Z +A X +A X +A Y +B X +B Z +C Z +B Z +B Z +B X +B X +C X +A X +C Y +C X +C Y +A X +B Z +A X +A Y +B Z +C Y +B Z +B Z +C Y +A Y +A Z +C X +C Y +C Y +C X +C Z +C Y +B Z +C Z +B X +C Z +B Z +A Z +B X +C X +C X +B X +B Z +C X +C X +B X +A Z +A X +A Z +B Z +B Z +B Z +A X +C Y +C Y +B Z +A X +A X +B Y +C Y +B X +C X +C Y +C X +C Y +A X +B X +A Z +A Y +B Y +A Z +B X +B Z +B Z +A Y +B X +C Y +B X +B Z +B Y +A X +A Z +C X +C X +C Z +C Z +B X +C X +B X +C X +B X +B Z +B Z +B X +B Y +C Y +A Z +B Y +A Z +C Y +B Z +C Z +C Z +B Y +B X +B X +C X +A Y +A Z +B Y +A Z +A Z +A X +A Z +B Y +A X +A X +C Z +C X +C X +C X +C Z +A Z +C Z +B Y +B Z +A X +B Z +C Z +C X +C Y +C X +A Z +C Y +C Y +C Y +B X +C Y +A Y +C Y +C X +A Z +A X +B Z +C Z +C X +A X +B Y +C Y +B Z +B Z +B Z +C Z +A Z +C Y +C X +C Z +C X +B Z +B Z +A X +B Z +A Z +A Z +B X +C Y +C Y +A X +B X +B Y +A X +C Y +A Z +C Y +C Y +B X +B X +B Z +B X +A Y +C Y +C Y +C Z +B X +A Y +A X +A X +C Y +C Z +C Y +A X +C Y +A X +B Y +B X +A X +C X +C X +A X +A Z +A X +C Y +B Y +B Z +B Y +C Z +A Z +B Y +A Z +A X +C X +B Z +C Z +B X +B Z +A Z +B Z +C X +B Z +B X +B Y +C Z +B Y +C Y +C X +C X +C Y +A Z +B Z +B X +B Z +B X +C Z +A X +A X +A X +B Y +B Y +B Z +A X +B Z +A X +A Z +B Z +B X +B X +A Z +A X +B Z +C Z +C Z +C Z +B Z +C Y +C X +C X +B Z +C Z +B Z +C Y +C X +B Z +C Z +B Z +B Z +B Z +C X +C X +B Y +B Z +B Z +C X +C Y +A X +A Z +C Z +C Z +C X +C Y +A Z +C Z +B Z +B Z +C Y +C X +B X +B Z +A Z +B Z +C Y +A X +B X +A X +C Z +C Y +C X +C X +B Z +C Z +B Z +C Z +C Z +A X +B Z +B Y +B Z +C X +B Z +A Z +C X +A X +B Z +C Z +C X +A X +C Z +A Y +B Z +C Z +C Y +A Z +B X +C Z +A X +A Y +C X +C Z +B Z +C X +A Z +B Z +C Z +C Z +A Y +C Y +C X +A Y +B Z +A Y +C X +C X +C Z +B X +B Z +C Y +A X +A Z +B Z +B Z +C Z +B Z +A X +A Y +B Y +A Z +B Z +B Z +C X +A Y +C Y +B Z +C X +B Y +B X +C Y +C X +B Z +B Z +B Z +C Y +B X +A X +B Z +C X +C Z +C X +A Z +B Z +C Y +B Z +A X +A X +B Z +C Z +C Z +B X +A Z +C Z +C X +B X +C Y +B Z +A X +C X +A Z +C Z +B X +B Z +A X +A X +B Z +C Y +C X +A Y +C X +C X +A X +A Z +B Y +C Z +C Z +C X +A Y +C X +B X +C X +B Y +C Y +B Z +A Z +C Z +A Y +A Z +B Y +C X +B Z +C X +C Y +C Z +B X +A X +C X +A Z +B Z +A Y +C Y +B Z +C X +C X +C X +B Y +C Y +B X +C X +A Z +A Y +A Z +C X +C Z +C X +C Z +B Y +A Z +B Z +C Z +B Z +B Z +C X +B Z +A Z +C Z +C Z +C X +A Y +B X +B Z +A Z +B Z +A X +B Z +C Y +C X +C X +A X +C X +B X +C Y +C X +B Z +B Z +C X +B Y +C Y +B Y +B X +C X +B X +B Z +B Z +C Y +A X +A X +A Z +A Y +C X +B Y +B Y +A Y +C Z +B X +B Z +B Z +C X +C Y +B Z +C Y +C Z +C X +C Z +A Z +B Y +A Z +B Z +C Y +C X +C Y +B Z +B Z +C X +C X +B Z +A X +A Z +C Y +B Y +A Y +B X +B X +A Z +B Z +B Z +A Z +A Z +C X +C X +C Y +C Z +A Y +C Y +B X +B Z +C X +B Z +C Z +B Z +C X +B Z +B X +A Y +B Z +C X +C Y +B Z +C X +C Y +C X +C X +A X +C X +C Y +A Z +B Z +C X +C Y +C Y +A Z +B Z +C X +C X +B X +A X +C X +C Y +B Z +C X +C X +C X +C Z +C Z +B Z +B Z +C Z +C Z +C X +A Z +C Y +C Y +C X +C Z +C Y +A Z +A Z +A Z +C Y +C Y +B X +B Z +B Y +C Z +A Z +C Z +C Y +C Z +A Y +A Y +B X +B Z +B X +A X +B X +C Z +C X +B Z +C Z +C Z +B Z +C X +C X +A X +C Z +C Y +A Z +A Z +C Z +A Y +B Y +B Z +C Z +A Z +A X +C Y +B Z +A X +B Z +B Z +A Z +A X +A Z +C Z +C X +B X +C Y +B Z +B X +C Y +C Y +B Z +C X +C Y +C Z +A Z +B X +C Y +A Z +C X +B Y +B Y +C Y +B Z +B Z +A X +C X +B Z +C X +B Z +B Y +C Y +B X +C Z +B Z +C Z +B Z +B Y +C X +C Z +C Z +C Y +B X +B Z +C Y +B Z +C Z +B Z +B Z +B Y +C X +C Y +C X +C X +A Z +C Y +C Y +C Z +A X +C X +B Y +B X +A Y +C X +B Z +C Y +C Y +B Z +B Y +B Z +C Y +C Y +C Y +C X +C X +A Z +C Y +C X +C X +A Y +C Y +B Z +A X +A X +C X +B Z +C Y +C Z +B Z +B Z +C Z +C Y +B Z +B X +C Z +B Z +C Y +C Z +B X +A Y +A Z +B X +C Z +C Y +A X +B Z +A X +B Z +B X +C Z +C Y +C X +A Z +C Y +C Y +A Z +A X +C Y +A X +A X +A X +B Z +C Y +B Z +B Z +B Z +C X +B Z +A X +B Y +C Y +C X +C X +C Y +C Y +A X +A X +C Y +C Z +B X +C Y +A X +C X +C X +C Y +B Z +B Z +A Y +B Z +C Y +C Y +C Y +B Z +C Z +C X +C X +B Z +C X +B X +B Z +B Y +C X +C Y +A X +B Z +B Z +C X +B Z +B X +B Z +C Y +B Z +C Y +C X +B Z +B Y +A Y +A X +A Z +A Z +B Y +A X +A X +C Y +C Y +A X +B Z +C X +A Z +B Z +B Z +A Y +C X +B Z +A Y +C Z +C Y +B X +C Z +C Z +C X +C Y +C X +C Y +B Z +B Z +B Z +B Z +A X +C Z +B Z +A Z +A X +A X +C X +C Y +C X +C X +C Z +C X +A Y +B Z +C X +A Z +B Z +C Y +B Z +A Z +A X +C X +A Z +C Z +A X +C Z +C Y +C Y +A X +C X +B Y +C Y +C Y +A Z +B Z +A Z +C Z +A Z +C Y +A X +C X +C Y +C Y +B Y +B Z +A Z +C X +B Y +A X +C Y +A Y +C Z +A Z +C Z +A X +B X +A Z +A Y +C X +A X +B Z +B Y +C Y +B Y +C X +B Z +C X +C Y +B Z +B X +B X +A X +C X +C Z +A X +B Z +C X +C X +C Z +B Y +A Z +A X +C Y +C Z +B Z +C X +B Y +B X +C X +C Z +C Y +B Z +A Z +B X +B Z +C X +C Y +C X +C X +B Z +B Z +B Z +B Z +B Z +C X +A Y +C Z +C Y +C X +C X +A Z +B Z +C Y +C Z +B X +B X +C Z +B Z +C Z +B X +B Z +C Z +C Y +B Z +A X +A X +C Y +C Z +C X +C X +A Z +C Z +C Z +B Z +C Z +B X +C X +A X +C X +B X +C Z +C X +A X +C Y +B Z +B X +C X +C X +C Z +B X +B Z +B Z +A Z +B Z +B X +A Z +C Y +B Z +C Z +C X +C Z +B Y +C Y +A X +B Y +B Z +C Z +B X +C Z +C Y +B Z +B Z +B Z +B Z +A X +B X +B Z +B Y +B Y +B Z +A Z +B Z +B Z +B X +B X +C X +B X +A Z +B Z +A Y +C X +B Y +A X +B Z +A X +B Z +C Y +C X +B Z +C Y +A Y +A X +C Z +B X +A Y +B Z +C Y +A X +C Z +C Y +C Z +A Z +B Y +A Z +C Y +C Y +A Y +A Z +C Y +C X +C X +C X +C Z +A Y +C X +C Y +A Z +B Y +B Y +B Z +A Z +B Z +A Y +B X +A Z +B Z +B Y +C Z +A Y +B X +A Z +B Y +B Z +B Z +B Z +B Z +B Z +A X +C Z +C Y +B Z +C X +A X +B Y +A Y +B Z +C Z +C X +C Y +B Z +B Z +C Z +B Z +B X +A X +A X +C X +B X +A Z +B X +C X +C Y +C Y +B Z +A Y +B Z +C Z +C Y +B Y +B Z +C Y +C Y +A Z +A X +A Y +C Z +A Y +C X +B Z +C Y +B Z +B Z +A Z +B Y +C X +B X +C X +B X +A Z +C X +C X +B Z +B X +C X +A X +C X +B Z +C Y +C X +B Z +A Z +B Y +A Z +B X +B X +A Z +B X +C Z +B Z +C Z +B Z +B X +A Z +C X +C X +C X +C Z +C X +C X +A Z +B Z +C Y +A Y +B X +C X +B Z +B X +C X +C Z +C Z +B Z +B Z +B X +C Y +A X +A X +B Z +B Z +B Z +C Z +B Z +C Z +A Y +A Y +B Y +C X +C Z +B Z +B Z +C X +B Z +B X +A Z +C X +B X +A Y +C Y +B Z +C Y +C Z +C Y +C Z +B Z +A X +C Z +B Z +B Z +A X +C X +C Y +C Y +C Y +C Y +B Z +B Z +B Z +C Z +A X +B Z +C Z +B Z +B X +C Z +B Z +C X +C Z +C X +B X +B Z +C X +A Z +B Z +B Y +C Y +B Z +C Z +C Z +C Z +C Y +B Z +B Z +B X +B Z +C Z +C Y +B X +B Z +C X +C Y +B X +C Y +C X +B Z +A Z +C X +A X +C X +A X +A X +B Z +B Z +A Y +B Z +A Z +C X +A Z +B Z +B Z +A Z +A X +B Z +B X +C X +B Z +C X +B X +A X +C Y +C Z +C Z +B Z +A Z +A Z +B Z +C X +B Y +C X +C Y +A Z +C X +C X +B Z +C Y +C Y +C X +B X +C Z +A X +A Y +B X +B Z +B Y +B X +C Y +C Z +B Z +B X +A X +C X +A X +A Z +B Z +B Y +B X +B Y +C Z +C X +C X +C Y +A Y +C Z +C Z +C Z +B X +C Y +C X +A Z +B X +C Y +C Y +A Z +C Z +C X +C X +A X +C X +B Z +B X +A Z +C X +B Z +B Z +B Z +B Z +A X +A Z +B X +B Z +B X +B Y +B X +B Z +A Y +C X +C Z +A Z +C X +C Y +A X +A Z +B X +B Y +C Y +C X +A X +C Z +C X +B Z +A X +B Z +A Y +A X +C Y +C X +C Y +A X +C Y +C Y +C Y +C Z +A X +A X +B Z +C X +B Z +B Z +B Z +C X +C X +B Z +B X +A X +A Z +A Y +C X +A X +A Z +B Z +B Z +C Y +A X +B Z +C Y +A X +A Z +C Y +A Z +C Z +C Z +C Y +C Z +A X +C Y +A Y +A X +A X +B X +A Z +C X +B X +C Y +C X +B Z +B Z +B Z +B Y +B Y +C Y +A X +B Z +A Z +C X +B X +A Z +C X +C Y +C Y +B Z +B Z +A Z +B Y +B Z +B Z +C X +B Y +B Z +B Z +C X +C Y +C Z +A Z +C Y +A X +C X +B Y +B Z +A Y +A X +B Z +B X +C X +A Z +C X +C Y +B X +C Y +C X +A Y +B Z +B Z +C Z +B Z +C Y +C X +C X +B Y +C Z +C X +C Y +A Z +C Y +A Z +A Y +A X +C Y +B Z +A Z +C X +C X +C X +C X +C X +B Z +A Y +A X +A Z +C Y +A Y +B Z +B Z +C X +A X +A X +C X +C X +C X +B X +A X +B Z +B Z +B X +B Z +A Y +C Z +C Y +B X +B X +B Z +A X +A X +B Z +B Z +C X +A X +C X +A Z +A X +C Z +A Z +C Z +B Z +A X +B Y +C Z +A Z +A Z +C X +A Z +B X +B Y +B Z +C X +B X +C X +B Z +B X +C Y +C X +C X +C Y +B Z +A Z +B X +C X +C Y +A Y +C X +A X +B Z +C Y +C Y +C Y +B Z +C Y +B Z +C X +B Z +B Z +A Y +C X +B X +C Z +B Z +B Z +A X +B Y +A X +B Z +C Z +B Z +C Z +A Z +C X +B Z +C X +B Z +C X +B Z +B Z +C X +B X +B Z +A Z +C X +C Y +B X +C Y +C Y +C X +B Z +C X +C X +A X +B Z +C Y +C Y +B Z +B Z +C Z +C X +C Y +B Z +A X +C Y +C Z +B Z +B X +C Y +A Z +C Z +C X +C Y +C X +C Z +A X +B X +C Y +C X +C Y +C X +C X +C Z +C X +C Z +B Z +C X +C X +A Z +C Z +C X +C X +B Z +C Y +B Z +C Y +C X +A X +C Z +C Z +A Z +B X +C Y +A Z +B Y +C Y +B X +C Y +B Z +B Y +B Z +C Z +B Z +C X +C Z +A Y +B Z +B Z +B Y +B X +B Z +C Z +C X +C Y +A Z +C X +C X +C Z +B X +B Z +C X +A Z +A Z +B Y +C X +C X +A X +C X +C X +A Z +B Z +C X +B Z +C X +C Y +B Z +C X +A X +B Z +C X +C Y +A X +C Z +B Z +B Z +C Y +C X +A Y +C Y +C X +C Y +A Z +B Z +A Y +B Y +C Y +A X +A X +C X +B Z +A Z +A X +B Y +B X +C X +B X +C X +C Z +B Y +C Y +C Z +B Z +B Y +A Z +B X +A Z +C X +A X +A X +B Z +B Z +A Y +C X +B Y +C Z +B Z +C X +A X +C X +C Z +A X +C X +C Z +C Z +C X +A X +A X +C Z +A Y +C Z +B Y +C X +C Z +A X +C Z +B Z +C Z +A Z +B Z +C Z +A Y +A Z +B Y +B X +A Y +C X +C Y +B X +B Z +C Z +B Z +C Z +C Z +A X +A Y +C X +B Z +A X +A Y +C Z +C Y +C Y +B Z +C X +B Z +B Z +A Y +B Z +B Z +B Z +B Z +B Z +B Z +B Z +C X +B X +B Z +A X +A X +C X +A Y +C X +C X +C Y +B Z +B X +C Y +A Y +A Y +C X +A Z +B Z +C X +C Z +C X +A Z +B Z +B Z +B X +B Z +C Y +A Y +C X +C X +A Z +B X +B Z +B Z +B X +C Y +C Y +A X +A Z +B Z +B Z +C X +B Y +A X +A X +C X +C Y +C Y +B Y +C X +C X +C X +A X +B Z +A Z +B X +B Z +B Z +A Z +C X +A X +B Z +B Z +C Y +C Y +B Z +C X +B X +C X +B Y +C Y +C X +C X +B Z +A X +A Z +B Z +A X +C X +A Z +C X +A Y +C Y +C Y +A X +C X +C X +C Z +B X +B Z +A Y +B Z +A Y +A X +C X +B Z +C X +C Z +C X +B Z +B Z +B Z +C Z +B Z +A Z +A Z +C Y +C Z +B X +A Y +A Z +A Z +B X +A Z +C Y +B Z +C X +C Y +B Z +A Z +C X +B Z +C X +A Y +B X +C Z +B Z +C X +A Z +B X +B Z +B Z +A Y +B X +A Z +C X +B Y +B Z +C X +C Z +B X +B Z +C X +A X +A Z +A Z +B Z +B Z +C X +B Z +C Z +B Z +C X +C Y +C Z +B Z +B Z +C X +B Y +A X +B X +A X +B Z +B Z +C X +A Z +A Z +A Z +A X +C X +B Z +A Z +C Y +C Z +A Z +C X +A Y +C Y +C Z +C Z +B Z +A X +A Y +C X +A Y +C X +A X +B Z +C Y +A X +B Z +A X +A Y +C X +A X +C Y +B X +B Z +A Z +B Z +A X +C Y +A Y +A Z +A Z +C Z +B Z +B Y +C Y +C X +B Z +A X +A X +C X +C Y +C X +A X +C Z +C X +B X +C X +A X +C X +B Z +A Z +A Z +C Z +C Z +A Z +A X +C Y +C X +B Z +C Y +C X +A Z +C Z +A Z +A Z +C Z +B Z +C X +A Z +B X +C Y +A Z +A X +A Z +A Z +A Z +A Z +C X +C Y +B X +B Z +A X +C Z +C Z +A Z +C X +C Z +B Z +A Z +C Z +C Y +A X +B Z +A Y +A Z +A Z +C Z +B Z +C Y +C X +A Y +A Y +B X +C Y +C X +B Z +C Z +C X +B Y +C X +C X +C Z +C Z +B Z +C Z +A Z +C Y +B Z +C Z +C Z +A Z +B Z +C Y +C Z +A X +B Z +B Z +A Y +B Z +C X +A Z +B X +B Z +C Z +B X +B Z +B Z +A X +A Y +A Z +B Z +B Z +A Z +A Y +B X +C Y +C Y +C Y +A Y +B Z +B X +A Z +A Z +C Y +C X +A Z +A Z +C Y +A Z +C X +C Z +B X +B Z +A X +C Z +A Z +C Y +B Z +A Z +C X +C X +B Z +C Z +B X +B X +A Z +B X +B X +C Y +A X +C Y +C X +C Y +C X +C Z +B X +B X +C X +A Z +B X +B Z +C Z +C Y +C Y +C X +B Z +C Y +B Z +C Y +C Y +B Z +A Z +A X +C Z +A Z +A X +C Y +B X +C Y +A Y +B Z +A Z +A X +C X +C X +A Y +C Z +C X +A X +C Y +B Z +B X +A Y +B Z +C X +C X +B Z +A X +C X +A Z +C Y +A Z +A Z +A X +C Z +B X +A Y +C Z +A Y +C Y +A X +A Z +A Z +A X +B Z diff --git a/day_2/lexer.l b/day_2/lexer.l new file mode 100644 index 0000000..7e852a2 --- /dev/null +++ b/day_2/lexer.l @@ -0,0 +1,40 @@ +%{ /* -*- C -*- */ +#include +#include +#include "parser.h" +%} + +%option warn nodefault + +/* makes the scanner terminate after reaching <> instead of assuming a new input was provided */ +%option noyywrap +/* disable some unused functionality, add scanner tracking */ +%option nounput noinput batch debug + +/* gimme a reentrant parser (overkill but more pure) */ +%option reentrant + +%option bison-bridge + + +NL [\n] +SPACE [ \t] +ROCK [AX] +PAPER [BY] +SCISSOR [CZ] + + +%% + +{NL} { return NEWLINE; } +{SPACE}+ { /* don't care */} +{ROCK} { return ROCK; } +{PAPER} { return PAPER; } +{SCISSOR} { return SCISSOR; } +<> { return END_OF_FILE; } +. { + printf("[error] Encountered unexpected token %s\n", yytext); + return 0; + } + +%% diff --git a/day_2/parser.y b/day_2/parser.y new file mode 100644 index 0000000..b2a16e4 --- /dev/null +++ b/day_2/parser.y @@ -0,0 +1,96 @@ +/* Require bison minimal version */ +%require "3.2" + +/* write out a header file containing the token defines */ +%header + +// Code for the header file generated by bison +%code requires { + typedef void* yyscan_t; + + struct parser_state { + unsigned long total_score; + }; +} + +// Code for the c file +%{ + #include + #include + #include "parser.h" + #include "lexer.h" + + void yyerror(struct parser_state* state, yyscan_t scanner, const char* msg) { + (void)state; + (void)scanner; + fprintf(stderr, "\033[93mSyntax Error: %s\033[0m\n", msg); + } +%} + +// define a reentrant parser +%define api.pure + +// enable parser tracing and detailed error messages (plus Lookahead Correction) +%define parse.trace +%define parse.error detailed +%define parse.lac full + +%lex-param { yyscan_t scanner } +%parse-param { struct parser_state* state } +%parse-param { yyscan_t scanner } + +%start input +%token NEWLINE +%token ROCK PAPER SCISSOR +%term END_OF_FILE + +/* the format is: themme */ +%% + +input + : line input + | END_OF_FILE { return 0; } + ; + +line + : game_move NEWLINE + ; + +game_move + : ROCK ROCK { state->total_score += 1 + 3; } + | ROCK PAPER { state->total_score += 2 + 6; } + | ROCK SCISSOR { state->total_score += 3 + 0; } + | PAPER ROCK { state->total_score += 1 + 0; } + | PAPER PAPER { state->total_score += 2 + 3; } + | PAPER SCISSOR { state->total_score += 3 + 6; } + | SCISSOR ROCK { state->total_score += 1 + 6; } + | SCISSOR PAPER { state->total_score += 2 + 0; } + | SCISSOR SCISSOR { state->total_score += 3 + 3; } + ; + +%% + +int main(void) { + struct parser_state parser_state; + parser_state.total_score = 0; + + yyscan_t scanner; + + if (yylex_init(&scanner)) { + fprintf(stderr, "\033[91m[error] Could not initialize lexer\n"); + return EXIT_FAILURE; + } + + if (yyparse(&parser_state, scanner)) { + // TODO: Error handling https://www.gnu.org/software/bison/manual/html_node/Parser-Function.html + // error during parse occured + return EXIT_FAILURE; + } + + yylex_destroy(scanner); + + // task 2 + printf("total score: %lu\n", parser_state.total_score); + + return 0; +}