Skip to content

Commit 6da99f0

Browse files
committed
Merge branch 'develop'
2 parents e304858 + 4897e98 commit 6da99f0

File tree

9 files changed

+152
-17
lines changed

9 files changed

+152
-17
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ term <- l:term _ '+' _ r:factor { $$ = l + r; }
167167
```
168168

169169
A rule variable identifier must consist of alphabets (both uppercase and lowercase letters), digits, and underscores.
170-
The first letter must be an alphabet.
170+
It must start with an alphabet, and must not start with `pcc_` or `PCC_`.
171171
The reserved keywords in C cannot be used.
172172

173173
**_sequence1_ `/` _sequence2_ `/` ... `/` _sequenceN_**
@@ -615,7 +615,7 @@ Note that the intrinsic macro replacement is in effect even in C preprocessor ma
615615
The marker variables with the respective specified identifiers are declared (version 3.0.0 or later).
616616
This can be used multiple times and can be used also in imported files.
617617
A marker variable identifier must consist of alphabets (both uppercase and lowercase letters), digits, and underscores.
618-
The first letter must be an alphabet.
618+
It must start with an alphabet, and must not start with `pcc_` or `PCC_`.
619619
All identifiers of the declared marker variables must be different from each other.
620620
621621
Marker variables are intended to be used as _markers_ of the input text to be parsed,

src/packcc.c

Lines changed: 116 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,6 +3123,20 @@ static node_t *parse_primary(input_state_t *input, node_t *rule) {
31233123
);
31243124
input->errnum++;
31253125
}
3126+
if (strncmp(n_p->data.reference.rvar, "pcc_", 4) == 0) {
3127+
print_error(
3128+
"%s:" FMT_LU ":" FMT_LU ": Starting with 'pcc_' in rule variable identifier '%s'\n",
3129+
input->path, (ulong_t)(l + 1), (ulong_t)(m + 1), n_p->data.reference.rvar
3130+
);
3131+
input->errnum++;
3132+
}
3133+
if (strncmp(n_p->data.reference.rvar, "PCC_", 4) == 0) {
3134+
print_error(
3135+
"%s:" FMT_LU ":" FMT_LU ": Starting with 'PCC_' in rule variable identifier '%s'\n",
3136+
input->path, (ulong_t)(l + 1), (ulong_t)(m + 1), n_p->data.reference.rvar
3137+
);
3138+
input->errnum++;
3139+
}
31263140
{
31273141
size_t i;
31283142
for (i = 0; i < rule->data.rule.rvars.n; i++) {
@@ -3629,6 +3643,20 @@ static bool_t parse_directive_marker_(input_state_t *input, const char *name, st
36293643
);
36303644
input->errnum++;
36313645
}
3646+
if (strncmp(output->p[i], "pcc_", 4) == 0) {
3647+
print_error(
3648+
"%s:" FMT_LU ":" FMT_LU ": Starting with 'pcc_' in marker variable identifier '%s'\n",
3649+
input->path, (ulong_t)(l + 1), (ulong_t)(m + 1), output->p[i]
3650+
);
3651+
input->errnum++;
3652+
}
3653+
if (strncmp(output->p[i], "PCC_", 4) == 0) {
3654+
print_error(
3655+
"%s:" FMT_LU ":" FMT_LU ": Starting with 'PCC_' in marker variable identifier '%s'\n",
3656+
input->path, (ulong_t)(l + 1), (ulong_t)(m + 1), output->p[i]
3657+
);
3658+
input->errnum++;
3659+
}
36323660
}
36333661
}
36343662
}
@@ -6403,6 +6431,79 @@ static bool_t generate(context_t *ctx) {
64036431
"}\n"
64046432
"\n"
64056433
);
6434+
stream__puts(
6435+
&sstream,
6436+
"MARK_FUNC_AS_USED\n"
6437+
"static pcc_auxil_t pcc_ref_auxil_(pcc_context_t *ctx) {\n"
6438+
" return ctx->auxil;\n"
6439+
"}\n"
6440+
"\n"
6441+
"MARK_FUNC_AS_USED\n"
6442+
"static const char *pcc_ref_capture_0_(pcc_context_t *ctx) {\n"
6443+
" return pcc_get_capture_string(ctx, &(ctx->capt0));\n"
6444+
"}\n"
6445+
"\n"
6446+
"MARK_FUNC_AS_USED\n"
6447+
"static size_t pcc_ref_capture_0s_(pcc_context_t *ctx) {\n"
6448+
" return ctx->pos + ctx->capt0.range.start;\n"
6449+
"}\n"
6450+
"\n"
6451+
"MARK_FUNC_AS_USED\n"
6452+
"static size_t pcc_ref_capture_0e_(pcc_context_t *ctx) {\n"
6453+
" return ctx->pos + ctx->capt0.range.end;\n"
6454+
"}\n"
6455+
"\n"
6456+
"MARK_FUNC_AS_USED\n"
6457+
"static const char *pcc_ref_capture_(pcc_context_t *ctx, pcc_thunk_chunk_t *in, size_t index) {\n"
6458+
" return pcc_get_capture_string(ctx, &(in->capts.p[index]));\n"
6459+
"}\n"
6460+
"\n"
6461+
"MARK_FUNC_AS_USED\n"
6462+
"static size_t pcc_ref_capture_s_(pcc_context_t *ctx, pcc_thunk_chunk_t *in, size_t index) {\n"
6463+
" return ctx->pos + in->capts.p[index].range.start;\n"
6464+
"}\n"
6465+
"\n"
6466+
"MARK_FUNC_AS_USED\n"
6467+
"static size_t pcc_ref_capture_e_(pcc_context_t *ctx, pcc_thunk_chunk_t *in, size_t index) {\n"
6468+
" return ctx->pos + in->capts.p[index].range.end;\n"
6469+
"}\n"
6470+
"\n"
6471+
"MARK_FUNC_AS_USED\n"
6472+
"static const char *pcc_ref_leaf_capture_0_(pcc_context_t *ctx, pcc_thunk_t *in) {\n"
6473+
" return pcc_get_capture_string(ctx, &(in->data.leaf.capt0));\n"
6474+
"}\n"
6475+
"\n"
6476+
"MARK_FUNC_AS_USED\n"
6477+
"static size_t pcc_ref_leaf_capture_0s_(pcc_context_t *ctx, pcc_thunk_t *in) {\n"
6478+
" return ctx->pos + in->data.leaf.capt0.range.start;\n"
6479+
"}\n"
6480+
"\n"
6481+
"MARK_FUNC_AS_USED\n"
6482+
"static size_t pcc_ref_leaf_capture_0e_(pcc_context_t *ctx, pcc_thunk_t *in) {\n"
6483+
" return ctx->pos + in->data.leaf.capt0.range.end;\n"
6484+
"}\n"
6485+
"\n"
6486+
"MARK_FUNC_AS_USED\n"
6487+
"static const char *pcc_ref_leaf_capture_(pcc_context_t *ctx, pcc_thunk_t *in, size_t index) {\n"
6488+
" return pcc_get_capture_string(ctx, in->data.leaf.capts.p[index]);\n"
6489+
"}\n"
6490+
"\n"
6491+
"MARK_FUNC_AS_USED\n"
6492+
"static size_t pcc_ref_leaf_capture_s_(pcc_context_t *ctx, pcc_thunk_t *in, size_t index) {\n"
6493+
" return ctx->pos + in->data.leaf.capts.p[index]->range.start;\n"
6494+
"}\n"
6495+
"\n"
6496+
"MARK_FUNC_AS_USED\n"
6497+
"static size_t pcc_ref_leaf_capture_e_(pcc_context_t *ctx, pcc_thunk_t *in, size_t index) {\n"
6498+
" return ctx->pos + in->data.leaf.capts.p[index]->range.end;\n"
6499+
"}\n"
6500+
"\n"
6501+
"MARK_FUNC_AS_USED\n"
6502+
"static pcc_value_t *pcc_ref_leaf_variable_(pcc_context_t *ctx, pcc_thunk_t *in, size_t index) {\n"
6503+
" return in->data.leaf.values.p[index];\n"
6504+
"}\n"
6505+
"\n"
6506+
);
64066507
{
64076508
size_t i, j, k;
64086509
for (i = 0; i < ctx->rules.n; i++) {
@@ -6418,31 +6519,31 @@ static bool_t generate(context_t *ctx) {
64186519
);
64196520
stream__puts(
64206521
&sstream,
6421-
"#define auxil (pcc_ctx->auxil)\n"
6522+
"#define auxil pcc_ref_auxil_(pcc_ctx)\n"
64226523
"#define " VARNAME_PROGPRED_OUT " (*pcc_out)\n"
64236524
);
64246525
stream__puts(
64256526
&sstream,
6426-
"#define " VARNAME_CAPTURE_PREFIX "0 pcc_get_capture_string(pcc_ctx, &(pcc_ctx->capt0))\n"
6427-
"#define " VARNAME_CAPTURE_PREFIX "0s ((const size_t)(pcc_ctx->pos + pcc_ctx->capt0.range.start))\n"
6428-
"#define " VARNAME_CAPTURE_PREFIX "0e ((const size_t)(pcc_ctx->pos + pcc_ctx->capt0.range.end))\n"
6527+
"#define " VARNAME_CAPTURE_PREFIX "0 pcc_ref_capture_0_(pcc_ctx)\n"
6528+
"#define " VARNAME_CAPTURE_PREFIX "0s pcc_ref_capture_0s_(pcc_ctx)\n"
6529+
"#define " VARNAME_CAPTURE_PREFIX "0e pcc_ref_capture_0e_(pcc_ctx)\n"
64296530
);
64306531
k = 0;
64316532
while (k < c->n) {
64326533
assert(c->p[k]->type == NODE_CAPTURE);
64336534
stream__printf(
64346535
&sstream,
6435-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU " pcc_get_capture_string(pcc_ctx, &(pcc_in->capts.p[" FMT_LU "]))\n",
6536+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU " pcc_ref_capture_(pcc_ctx, pcc_in, " FMT_LU ")\n",
64366537
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
64376538
);
64386539
stream__printf(
64396540
&sstream,
6440-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "s ((const size_t)(pcc_ctx->pos + pcc_in->capts.p[" FMT_LU "].range.start))\n",
6541+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "s pcc_ref_capture_s_(pcc_ctx, pcc_in, " FMT_LU ")\n",
64416542
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
64426543
);
64436544
stream__printf(
64446545
&sstream,
6445-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "e ((const size_t)(pcc_ctx->pos + pcc_in->capts.p[" FMT_LU "].range.end))\n",
6546+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "e pcc_ref_capture_e_(pcc_ctx, pcc_in, " FMT_LU ")\n",
64466547
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
64476548
);
64486549
k++;
@@ -6522,41 +6623,41 @@ static bool_t generate(context_t *ctx) {
65226623
);
65236624
stream__puts(
65246625
&sstream,
6525-
"#define auxil (pcc_ctx->auxil)\n"
6626+
"#define auxil pcc_ref_auxil_(pcc_ctx)\n"
65266627
"#define " VARNAME_ACTION_OUT " (*pcc_out)\n"
65276628
);
65286629
k = 0;
65296630
while (k < v->n) {
65306631
assert(v->p[k]->type == NODE_REFERENCE);
65316632
stream__printf(
65326633
&sstream,
6533-
"#define %s (*(pcc_in->data.leaf.values.p[" FMT_LU "]))\n",
6634+
"#define %s (*pcc_ref_leaf_variable_(pcc_ctx, pcc_in, " FMT_LU "))\n",
65346635
v->p[k]->data.reference.rvar, (ulong_t)v->p[k]->data.reference.index
65356636
);
65366637
k++;
65376638
}
65386639
stream__puts(
65396640
&sstream,
6540-
"#define " VARNAME_CAPTURE_PREFIX "0 pcc_get_capture_string(pcc_ctx, &(pcc_in->data.leaf.capt0))\n"
6541-
"#define " VARNAME_CAPTURE_PREFIX "0s ((const size_t)(pcc_ctx->pos + pcc_in->data.leaf.capt0.range.start))\n"
6542-
"#define " VARNAME_CAPTURE_PREFIX "0e ((const size_t)(pcc_ctx->pos + pcc_in->data.leaf.capt0.range.end))\n"
6641+
"#define " VARNAME_CAPTURE_PREFIX "0 pcc_ref_leaf_capture_0_(pcc_ctx, pcc_in)\n"
6642+
"#define " VARNAME_CAPTURE_PREFIX "0s pcc_ref_leaf_capture_0s_(pcc_ctx, pcc_in)\n"
6643+
"#define " VARNAME_CAPTURE_PREFIX "0e pcc_ref_leaf_capture_0e_(pcc_ctx, pcc_in)\n"
65436644
);
65446645
k = 0;
65456646
while (k < c->n) {
65466647
assert(c->p[k]->type == NODE_CAPTURE);
65476648
stream__printf(
65486649
&sstream,
6549-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU " pcc_get_capture_string(pcc_ctx, pcc_in->data.leaf.capts.p[" FMT_LU "])\n",
6650+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU " pcc_ref_leaf_capture_(pcc_ctx, pcc_in, " FMT_LU ")\n",
65506651
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
65516652
);
65526653
stream__printf(
65536654
&sstream,
6554-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "s ((const size_t)(pcc_ctx->pos + pcc_in->data.leaf.capts.p[" FMT_LU "]->range.start))\n",
6655+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "s pcc_ref_leaf_capture_s_(pcc_ctx, pcc_in, " FMT_LU ")\n",
65556656
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
65566657
);
65576658
stream__printf(
65586659
&sstream,
6559-
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "e ((const size_t)(pcc_ctx->pos + pcc_in->data.leaf.capts.p[" FMT_LU "]->range.end))\n",
6660+
"#define " VARNAME_CAPTURE_PREFIX FMT_LU "e pcc_ref_leaf_capture_e_(pcc_ctx, pcc_in, " FMT_LU ")\n",
65606661
(ulong_t)(c->p[k]->data.capture.index + 1), (ulong_t)c->p[k]->data.capture.index
65616662
);
65626663
k++;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
%marker @foo @_foo @pcc_foo @PCC_foo @bar
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bats
2+
3+
load "$TESTDIR/utils.sh"
4+
5+
@test "Testing invalid_identifier_mvar.d - generation" {
6+
run test_generate
7+
[ "$status" -ne 0 ]
8+
[ $(echo "$output" | egrep "marker variable identifier '(_foo|pcc_foo|PCC_foo)'" | wc -l) == "3" ]
9+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
rule <- foo:num _ '+' _ _foo:num _ '+' _ pcc_foo:num _ '+' _ PCC_foo:num _ '+' _ bar:num _ EOL
2+
num <- [0-9]+
3+
_ <- [ \t]*
4+
EOL <- '\n' / '\r\n' / '\r' / ';'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bats
2+
3+
load "$TESTDIR/utils.sh"
4+
5+
@test "Testing invalid_identifier_rvar.d - generation" {
6+
run test_generate
7+
[ "$status" -ne 0 ]
8+
[ $(echo "$output" | egrep "rule variable identifier '(_foo|pcc_foo|PCC_foo)'" | wc -l) == "3" ]
9+
}

tests/issue_96.d/expected.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9 + 7 = 16

tests/issue_96.d/input.peg

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
%source {
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
}
5+
6+
rule <- o:num _ '+' _ p:num _ EOL { $$ = o + p; printf("%d + %d = %d\n", o, p, $$); }
7+
num <- < [0-9]+ > { $$ = atoi($1); }
8+
_ <- [ \t]*
9+
EOL <- '\n' / '\r\n' / '\r' / ';'

tests/issue_96.d/input.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9 + 7

0 commit comments

Comments
 (0)