From 3d709982b66314b23b5957041580dd4918561a53 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Sun, 6 Feb 2022 18:11:03 +0800 Subject: Add a script to build for debugging purposes I think this is a better practice than the previously used hard-coded configure option. --- configure | 13 ---------- configure.ac | 17 ++++++------ configure.debug | 3 +++ src/Makefile.am | 2 +- src/cnp.c | 72 +++++++++++++++++++++++++++++++++++++-------------- src/config.h | 3 --- src/test/check_cnp.c | 5 ++-- src/test/check_pred.c | 21 ++++++++------- 8 files changed, 79 insertions(+), 57 deletions(-) create mode 100755 configure.debug diff --git a/configure b/configure index 32b4ff1..34c4673 100755 --- a/configure +++ b/configure @@ -713,7 +713,6 @@ ac_user_opts=' enable_option_checking enable_dependency_tracking enable_silent_rules -enable_debug ' ac_precious_vars='build_alias host_alias @@ -1352,7 +1351,6 @@ Optional Features: speeds up one-time build --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") - --enable-debug enable the debugging features Some influential environment variables: CC C compiler command @@ -5244,18 +5242,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -# Check whether --enable-debug was given. -if test ${enable_debug+y} -then : - enableval=$enable_debug; -fi - -if test "x$enable_debug" = "xyes"; then - -printf "%s\n" "#define DEBUG /**/" >>confdefs.h - - fi ac_config_files="$ac_config_files Makefile src/Makefile" diff --git a/configure.ac b/configure.ac index 22e30e5..55f1dde 100644 --- a/configure.ac +++ b/configure.ac @@ -30,14 +30,15 @@ dnl AC_CONFIG_SUBDIRS([src]) dnl Checks for DEBUG option. -AC_ARG_ENABLE([debug], -AS_HELP_STRING([--enable-debug], -[enable the debugging features])) - -if test "x$enable_debug" = "xyes"; then - AC_DEFINE([DEBUG], [], [Define if one wants to debug the program.]) - dnl AC_CHECK_FUNCS([clock_gettime]) -fi +dnl This is bad practice. Use the script configure.debug instead. +dnl AC_ARG_ENABLE([debug], +dnl AS_HELP_STRING([--enable-debug], +dnl [enable the debugging features])) + +dnl if test "x$enable_debug" = "xyes"; then +dnl AC_DEFINE([DEBUG], [], [Define if one wants to debug the program.]) +dnl dnl AC_CHECK_FUNCS([clock_gettime]) +dnl fi AC_CONFIG_FILES([Makefile src/Makefile]) diff --git a/configure.debug b/configure.debug new file mode 100755 index 0000000..2ea3395 --- /dev/null +++ b/configure.debug @@ -0,0 +1,3 @@ +#!/bin/sh + +./configure CPPFLAGS="-DDEBUG" CFLAGS="-g -O0" diff --git a/src/Makefile.am b/src/Makefile.am index d097f1f..77c2dfe 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -AM_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers +AM_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers -O3 noinst_LIBRARIES = libeps.a libeps_a_SOURCES = grammar.c list.c util.c reader.c str.c \ diff --git a/src/cnp.c b/src/cnp.c index ce5a527..3c76f52 100644 --- a/src/cnp.c +++ b/src/cnp.c @@ -654,11 +654,13 @@ cnp_parse(Grammar *g, str *string) while ((current_prodecor = pop_procr(env_r(env), env_u(env), ¤t_grade))) { - /* fleprintf("{ %ld, %ld, %ld, %ld, %ld }\n", - * current_prodecor->x, current_prodecor->y, - * current_prodecor->z, current_prodecor->u, - * current_grade); - * print_procr(env_r(env)); */ +#ifdef DEBUG + fleprintf("{ %ld, %ld, %ld, %ld, %ld }\n", + current_prodecor->x, current_prodecor->y, + current_prodecor->z, current_prodecor->u, + current_grade); + print_procr(env_r(env)); +#endif /* different cases */ @@ -683,8 +685,9 @@ cnp_parse(Grammar *g, str *string) goto continue_label; } - - /* fleprintf0("non empty rule\n"); */ +#ifdef DEBUG + fleprintf0("non empty rule\n"); +#endif /* if at the end of a rule, return if possible */ if (current_prodecor->z == list_length(right)) { @@ -696,28 +699,37 @@ cnp_parse(Grammar *g, str *string) goto continue_label; } - - /* fleprintf0("not at the end of the rule\n"); */ +#ifdef DEBUG + fleprintf0("not at the end of the rule\n"); +#endif /* if at the start of a rule, no need for test_select */ if (current_prodecor->z == 0) { - /* fleprintf0("at the start of the rule\n"); */ +#ifdef DEBUG + fleprintf0("at the start of the rule\n"); +#endif current_prodecor->z = 1; /* otherwise test select */ } else { - /* fleprintf0("start by test select\n"); */ +#ifdef DEBUG + fleprintf0("start by test select\n"); +#endif tnts = array_to_list(list_array(right)+current_prodecor->z, list_length(right)-current_prodecor->z); if (test_select(env, *(num_string+current_grade), current_prodecor->x, tnts)) { - /* fleprintf0("successful test\n"); */ +#ifdef DEBUG + fleprintf0("successful test\n"); +#endif free(tnts); tnts = NULL; ++(current_prodecor->z); } else { - /* fleprintf0("failed test\n"); */ +#ifdef DEBUG + fleprintf0("failed test\n"); +#endif free(tnts); tnts = NULL; goto continue_label; @@ -731,7 +743,9 @@ cnp_parse(Grammar *g, str *string) TERMINAL || ((TNT *) list_nth(right, current_prodecor->z-1))->type == PREDICATE) { - /* fleprintf0("found terminal\n"); */ +#ifdef DEBUG + fleprintf0("found terminal\n"); +#endif /* add to BSR set */ errorp = bsr_add(env_grammar(env), env_bsrp(env), @@ -747,7 +761,9 @@ cnp_parse(Grammar *g, str *string) if (current_prodecor->z == list_length(right)) { if (env_follow_p(env, current_prodecor->x, *(num_string+current_grade))) { - /* fleprintf0("we choose to return\n"); */ +#ifdef DEBUG + fleprintf0("we choose to return\n"); +#endif rtn(env, current_prodecor->x, current_prodecor->u, current_grade); /* fleprintf0("hi\n"); */ @@ -755,19 +771,25 @@ cnp_parse(Grammar *g, str *string) goto continue_label; } - /* fleprintf0("terminal not at the end\n"); */ +#ifdef DEBUG + fleprintf0("terminal not at the end\n"); +#endif /* else test select */ tnts = array_to_list(list_array(right)+current_prodecor->z, list_length(right)-current_prodecor->z); if (test_select(env, *(num_string+current_grade), current_prodecor->x, tnts)) { - /* fleprintf0("Successful test\n"); */ +#ifdef DEBUG + fleprintf0("Successful test\n"); +#endif free(tnts); tnts = NULL; (current_prodecor->z)++; } else { - /* fleprintf0("Failed test\n"); */ +#ifdef DEBUG + fleprintf0("Failed test\n"); +#endif /* printf("next thing is "); */ /* print_tnt(list_nth(right, current_prodecor->z)); */ /* printf("\n"); */ @@ -777,8 +799,18 @@ cnp_parse(Grammar *g, str *string) } } - /* fleprintf0("encountered non-terminal\n"); */ - +#ifdef DEBUG + fleprintf0("encountered non-terminal\n"); +#endif + + /* FIXME: Add the optimisation that when we know only one rule for + the encountered non-terminal is possible according to the + current input, either because the non-terminal is an "LL(1)" + non-terminal, or because the current input symbol says so, we + don't want to go through the process of adding a process + descriptor only to pop it up immediately. This can remove the + burden brought by the generalized techniques when they are not + needed. */ /* when a nonterminal is encountered, we call it */ cnp_call(env, (pair3) { .x = current_prodecor->x, diff --git a/src/config.h b/src/config.h index 82712aa..64d2a3d 100644 --- a/src/config.h +++ b/src/config.h @@ -1,9 +1,6 @@ /* src/config.h. Generated from config.h.in by configure. */ /* src/config.h.in. Generated from configure.ac by autoheader. */ -/* Define if one wants to debug the program. */ -/* #undef DEBUG */ - /* Name of package */ #define PACKAGE "eps" diff --git a/src/test/check_cnp.c b/src/test/check_cnp.c index f01a68c..5a9e720 100644 --- a/src/test/check_cnp.c +++ b/src/test/check_cnp.c @@ -54,7 +54,7 @@ print_label6(pair6 label) add_to_list(rules, rule); \ } while (0) -#define GRAMMAR 4 +#define GRAMMAR 2 int main(int UNUSED argc, char ** UNUSED argv) @@ -183,7 +183,8 @@ main(int UNUSED argc, char ** UNUSED argv) string = new_utf8("aab", 3); break; case 2: - string = new_utf8("[[[[[[[[[[[[[[[[[[[[[[[++[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]--]]]]]]]]]]]]]]]]]]]]]]]", 204); + /* taken from Wikipedia: */ + string = new_utf8("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.", 106); break; case 3: string = new_utf8("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 100); diff --git a/src/test/check_pred.c b/src/test/check_pred.c index 2767c45..14081d5 100644 --- a/src/test/check_pred.c +++ b/src/test/check_pred.c @@ -90,15 +90,16 @@ main(int UNUSED argc, char ** UNUSED argv) user_name_s = new_utf8(user_name, 5); - SAFE_MALLOC(char, raw_name, 7, return 1;); + SAFE_MALLOC(char, raw_name, 8, return 1;); - *(raw_name+0) = 'a'; - *(raw_name+1) = '-'; - *(raw_name+2) = 'z'; - *(raw_name+3) = 'A'; - *(raw_name+4) = '-'; - *(raw_name+5) = 'Z'; - *(raw_name+6) = 0; + *(raw_name+0) = '^'; + *(raw_name+1) = 'a'; + *(raw_name+2) = '-'; + *(raw_name+3) = 'z'; + *(raw_name+4) = 'A'; + *(raw_name+5) = '-'; + *(raw_name+6) = 'Z'; + *(raw_name+7) = 0; raw_name_s = new_utf8(raw_name, 6); @@ -111,7 +112,7 @@ main(int UNUSED argc, char ** UNUSED argv) *(pred_bytes+pred_bytes_len++) = 'A' + i; if (add_to_list(preds, new_ptd(user_name_s, raw_name_s, - dfa_from_bytes + dfa_from_bytes_neg (pred_bytes_len, pred_bytes)))) { fleprintf0("Fail to add a predicate\n"); return 1; @@ -125,7 +126,7 @@ main(int UNUSED argc, char ** UNUSED argv) print_grammar(g); - utf8 *string = new_utf8("awdfsdjbfsjdhxy", 15); + utf8 *string = new_utf8("++--__,.(){}><|", 15); printf("\nPrinting the input...\n%s\n", get_data((str *) string)); -- cgit v1.2.3-18-g5258