aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--bp.18
-rw-r--r--bpeg.c25
3 files changed, 30 insertions, 5 deletions
diff --git a/README.md b/README.md
index 537055c..24cb549 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,8 @@ It's written in pure C with no dependencies.
* `-h` `--help` print the usage and quit
* `-v` `--verbose` print verbose debugging info
* `-i` `--ignore-case` perform a case-insensitive match
+* `-e` `--explain` print an explanation of the matches
+* `-j` `--json` print matches as JSON objects
* `-d` `--define <name>:<def>` define a grammar rule
* `-D` `--define-string <name>:<def>` define a grammar rule (string-pattern)
* `-p` `--pattern <pat>` provide a pattern (equivalent to `bp '\(<pat>)'`)
diff --git a/bp.1 b/bp.1
index 03874ef..6eaf937 100644
--- a/bp.1
+++ b/bp.1
@@ -7,6 +7,8 @@ bp \- Bruce's Parsing Expression Grammar tool
.B bp
[\fI-h\fR|\fI--help\fR]
[\fI-v\fR|\fI--verbose\fR]
+[\fI-e\fR|\fI--explain\fR]
+[\fI-j\fR|\fI--json\fR]
[\fI-i\fR|\fI--ignore-case\fR \fI<pattern>\fR]
[\fI-p\fR|\fI--pattern\fR \fI<pattern>\fR]
[\fI-P\fR|\fI--pattern-string\fR \fI<string-pattern>\fR]
@@ -23,6 +25,12 @@ bp \- Bruce's Parsing Expression Grammar tool
.B \-v\fR, \fB--verbose
Print debugging information.
+.B \-e\fR, \fB--explain
+Print a visual explanation of the matches.
+
+.B \-j\fR, \fB--json
+Print a JSON list of the matches. (Pairs with \fB--verbose\fR for more detail)
+
.B \-i\fR, \fB--ignore-case
Perform pattern matching case-insensitively.
diff --git a/bpeg.c b/bpeg.c
index 2adc39f..c0a2f9b 100644
--- a/bpeg.c
+++ b/bpeg.c
@@ -27,6 +27,7 @@ static const char *usage = (
" -h --help print the usage and quit\n"
" -v --verbose print verbose debugging info\n"
" -e --explain explain the matches\n"
+ " -j --json print matches as a list of JSON objects\n"
" -i --ignore-case preform matching case-insensitively\n"
" -d --define <name>:<def> define a grammar rule\n"
" -D --define-string <name>:<def> define a grammar rule (string-pattern)\n"
@@ -135,16 +136,17 @@ int main(int argc, char *argv[])
if (streq(argv[i], "--")) {
++i;
break;
- } else if (streq(argv[i], "--help") || streq(argv[i], "-h")) {
+ } else if (streq(argv[i], "--help")) {
+ flag_help:
printf("%s\n", usage);
return 0;
- } else if (streq(argv[i], "--verbose") || streq(argv[i], "-v")) {
+ } else if (streq(argv[i], "--verbose")) {
flags |= BPEG_VERBOSE;
- } else if (streq(argv[i], "--explain") || streq(argv[i], "-e")) {
+ } else if (streq(argv[i], "--explain")) {
flags |= BPEG_EXPLAIN;
- } else if (streq(argv[i], "--json") || streq(argv[i], "-j")) {
+ } else if (streq(argv[i], "--json")) {
flags |= BPEG_JSON;
- } else if (streq(argv[i], "--ignore-case") || streq(argv[i], "-i")) {
+ } else if (streq(argv[i], "--ignore-case")) {
flags |= BPEG_IGNORECASE;
} else if (FLAG("--replace") || FLAG("-r")) {
file_t *replace_file = spoof_file("<replace argument>", flag);
@@ -200,6 +202,19 @@ int main(int argc, char *argv[])
++npatterns;
} else if (FLAG("--mode") || FLAG("-m")) {
rule = flag;
+ } else if (argv[i][0] == '-' && argv[i][1] && argv[i][1] != '-') { // single-char flags
+ for (char *c = &argv[i][1]; *c; ++c) {
+ switch (*c) {
+ case 'h': goto flag_help;
+ case 'v': flags |= BPEG_VERBOSE; break;
+ case 'e': flags |= BPEG_EXPLAIN; break;
+ case 'j': flags |= BPEG_JSON; break;
+ case 'i': flags |= BPEG_IGNORECASE; break;
+ default:
+ printf("Unrecognized flag: -%c\n\n%s\n", *c, usage);
+ return 1;
+ }
+ }
} else if (argv[i][0] != '-') {
if (npatterns > 0) break;
file_t *arg_file = spoof_file("<pattern argument>", argv[i]);