bool

Програм за тестирање логичких израза
git clone https://git.sr.ht/~strahinja/bool
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 75591428cda8073724586d0a5f2bb85c72e2d44a
родитељ fda80186bddc5a8adc4bdc50f9611d435c218337
Аутор: Страхиња Радић <sr@strahinja.org>
Датум:   Tue, 20 Jan 2026 15:13:20 +0100

Add -> (implication); add manpage

Diffstat:
MMakefile | 25+++++++++++++++++++++++--
Mbool.h | 3++-
Mbool.l | 4++++
Mbool.y | 13++++++++++++-
Mconfig.mk | 17+++++++++++++++--
измењених датотека: 5, додавања: 56(+), брисања: 6(-)

diff --git a/Makefile b/Makefile @@ -3,12 +3,15 @@ include config.mk .SUFFIXES: -.SUFFIXES: .h.in .h .y .l .c .o +.SUFFIXES: .1.in .1 .h.in .h .y .l .c .o + +.1.in.1: + sh lib/replacepat $< $@ .h.in.h: sh lib/replacepat $< $@ -all: makedate makeversion $(PROG) +all: makedate makeversion $(PROG) $(MANPAGE) if [ -f .rebuild ]; then rm .rebuild; make -e all; else true; fi date: @@ -23,6 +26,8 @@ makedate: makeversion: sh lib/makeversion -l +$(MANPAGE): $(MANPAGE).in date version + version.h: version.h.in date version lex.yy.c: bool.l @@ -44,4 +49,20 @@ $(PROG): $(OBJS) $(SRC) $(HEADERS) clean: rm -f bool y.tab.c lex.yy.c *.o *~ +install: all + $(INSTALL) -Dm 0644 $(MANPAGE) $(MANPREFIX)/man1/$(MANPAGE) + $(INSTALL) -Dm 0644 README $(DOCDIR)/README + $(INSTALL) -Dm 0644 LICENSE $(DOCDIR)/LICENSE + $(INSTALL) -Dm 0755 $(PROG) $(BINDIR)/$(PROG) + +uninstall: + rm -f $(MANPREFIX)/man1/$(MANPAGE) + rmdir $(MANPREFIX)/man1 2>/dev/null || true + rmdir $(MANPREFIX) 2>/dev/null || true + rm -f $(DOCDIR)/README + rm -f $(DOCDIR)/LICENSE + rmdir $(DOCDIR) 2>/dev/null || true + rm -f $(PROG) $(BINDIR)/$(PROG) + rmdir $(BINDIR) 2>/dev/null || true + .PHONY: all clean diff --git a/bool.h b/bool.h @@ -9,7 +9,8 @@ enum Operator { OP_OR, OP_AND, OP_XOR, - OP_NOT + OP_NOT, + OP_IMPL }; extern const char* node_type_ids[]; diff --git a/bool.l b/bool.l @@ -51,6 +51,10 @@ extern void yyerror(const char* format, ...); yydbg("XOR operator"); return *yytext; } +"=>" { colno += 2; + yydbg("IMPL operator"); + return IMPL; + } {wspace} { colno++; yydbg("Whitespace"); diff --git a/bool.y b/bool.y @@ -7,6 +7,7 @@ struct expr_node* node_ptr; } +%left IMPL %left '|' %left '^' %left '&' @@ -71,7 +72,8 @@ const char* operator_images[] = { [OP_OR] = "OR", [OP_AND] = "AND", [OP_XOR] = "XOR", - [OP_NOT] = "NOT" + [OP_NOT] = "NOT", + [OP_IMPL] = "IMPL" }; static struct expr_node* root = NULL; @@ -272,6 +274,10 @@ evaluate(const struct expr_node* node) result = evaluate(node->expr.binary->args[0]) ^ evaluate(node->expr.binary->args[1]); break; + case OP_IMPL: + result = !evaluate(node->expr.binary->args[0]) + | evaluate(node->expr.binary->args[1]); + break; default:; } break; @@ -340,6 +346,11 @@ expr: IDENT { $$ = new_expr(NT_IDENT, OP_NONE, 1, $1); print_node(0, 1, $$); root = $$; } + | expr IMPL expr + { $$ = new_expr(NT_BINARY, OP_IMPL, 2, $1, $3); + print_node(0, 1, $$); + root = $$; + } | '~' expr { $$ = new_expr(NT_UNARY, OP_NOT, 1, $2); print_node(0, 1, $$); root = $$; diff --git a/config.mk b/config.mk @@ -1,13 +1,26 @@ +#CC = clang #CFLAGS = -Os -Wextra -Wall -pedantic -std=c99 CFLAGS = -O0 -ggdb -Wextra -Wall -pedantic -std=c99 CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \ -D_XOPEN_SOURCE=700 -DNDEBUG +# OpenBSD +#CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \ +# -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -DNDEBUG +INSTALL = install LIBS = #-lfl SRC = bool.l bool.y lex.yy.c y.tab.c HEADERS = bool.h version.h y.tab.h OBJS = bool.o lex.yy.o -#CC = clang +PREFIX = /usr/local +PROG = bool FLEX = flex YACC = yacc YACCFLAGS = -d -PROG = bool + +# Derived macros +BINDIR = $(DESTDIR)$(PREFIX)/bin +DOCDIR = $(DESTDIR)$(PREFIX)/share/doc/$(PROG) +MANPREFIX = $(DESTDIR)$(PREFIX)/share/man +# OpenBSD +#MANPREFIX = $(DESTDIR)$(PREFIX)/man +MANPAGE = $(PROG).1