lrama 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yaml +24 -1
- data/Gemfile +3 -2
- data/README.md +11 -1
- data/doc/TODO.md +5 -1
- data/exe/lrama +0 -1
- data/lib/lrama/command.rb +5 -10
- data/lib/lrama/context.rb +0 -2
- data/lib/lrama/counterexamples/derivation.rb +63 -0
- data/lib/lrama/counterexamples/example.rb +124 -0
- data/lib/lrama/counterexamples/path.rb +69 -0
- data/lib/lrama/counterexamples/state_item.rb +6 -0
- data/lib/lrama/counterexamples/triple.rb +21 -0
- data/lib/lrama/counterexamples.rb +283 -0
- data/lib/lrama/digraph.rb +2 -3
- data/lib/lrama/grammar/auxiliary.rb +7 -0
- data/lib/lrama/grammar/code.rb +0 -1
- data/lib/lrama/grammar/rule.rb +6 -0
- data/lib/lrama/grammar/symbol.rb +4 -11
- data/lib/lrama/grammar.rb +44 -8
- data/lib/lrama/lexer/token/type.rb +8 -0
- data/lib/lrama/lexer/token.rb +4 -2
- data/lib/lrama/lexer.rb +3 -4
- data/lib/lrama/output.rb +1 -1
- data/lib/lrama/parser/token_scanner.rb +3 -6
- data/lib/lrama/parser.rb +9 -0
- data/lib/lrama/state/reduce_reduce_conflict.rb +9 -0
- data/lib/lrama/state/shift_reduce_conflict.rb +9 -0
- data/lib/lrama/state.rb +11 -4
- data/lib/lrama/states/item.rb +38 -2
- data/lib/lrama/states.rb +28 -34
- data/lib/lrama/states_reporter.rb +29 -16
- data/lib/lrama/type.rb +4 -0
- data/lib/lrama/version.rb +1 -1
- data/lib/lrama.rb +2 -0
- data/template/bison/yacc.c +103 -95
- metadata +13 -2
data/template/bison/yacc.c
CHANGED
@@ -1220,26 +1220,30 @@ yydestruct (const char *yymsg,
|
|
1220
1220
|
|
1221
1221
|
<%- if output.error_recovery -%>
|
1222
1222
|
#ifndef YYMAXREPAIR
|
1223
|
-
# define YYMAXREPAIR 3
|
1223
|
+
# define YYMAXREPAIR(<%= output.parse_param_name %>) (3)
|
1224
1224
|
#endif
|
1225
1225
|
|
1226
|
-
|
1226
|
+
#ifndef YYERROR_RECOVERY_ENABLED
|
1227
|
+
# define YYERROR_RECOVERY_ENABLED(<%= output.parse_param_name %>) (1)
|
1228
|
+
#endif
|
1229
|
+
|
1230
|
+
enum yy_repair_type {
|
1227
1231
|
insert,
|
1228
1232
|
delete,
|
1229
1233
|
shift,
|
1230
1234
|
};
|
1231
1235
|
|
1232
|
-
struct
|
1233
|
-
enum
|
1236
|
+
struct yy_repair {
|
1237
|
+
enum yy_repair_type type;
|
1234
1238
|
yysymbol_kind_t term;
|
1235
1239
|
};
|
1236
|
-
typedef struct
|
1240
|
+
typedef struct yy_repair yy_repair;
|
1237
1241
|
|
1238
|
-
struct
|
1242
|
+
struct yy_repairs {
|
1239
1243
|
/* For debug */
|
1240
1244
|
int id;
|
1241
1245
|
/* For breadth-first traversing */
|
1242
|
-
struct
|
1246
|
+
struct yy_repairs *next;
|
1243
1247
|
YYPTRDIFF_T stack_length;
|
1244
1248
|
/* Bottom of states */
|
1245
1249
|
yy_state_t *states;
|
@@ -1248,10 +1252,10 @@ struct repairs {
|
|
1248
1252
|
/* repair length */
|
1249
1253
|
int repair_length;
|
1250
1254
|
/* */
|
1251
|
-
struct
|
1252
|
-
struct
|
1255
|
+
struct yy_repairs *prev_repair;
|
1256
|
+
struct yy_repair repair;
|
1253
1257
|
};
|
1254
|
-
typedef struct
|
1258
|
+
typedef struct yy_repairs yy_repairs;
|
1255
1259
|
|
1256
1260
|
struct yy_term {
|
1257
1261
|
yysymbol_kind_t kind;
|
@@ -1260,12 +1264,12 @@ struct yy_term {
|
|
1260
1264
|
};
|
1261
1265
|
typedef struct yy_term yy_term;
|
1262
1266
|
|
1263
|
-
struct
|
1267
|
+
struct yy_repair_terms {
|
1264
1268
|
int id;
|
1265
1269
|
int length;
|
1266
1270
|
yy_term terms[];
|
1267
1271
|
};
|
1268
|
-
typedef struct
|
1272
|
+
typedef struct yy_repair_terms yy_repair_terms;
|
1269
1273
|
|
1270
1274
|
static void
|
1271
1275
|
yy_error_token_initialize (yysymbol_kind_t yykind, YYSTYPE * const yyvaluep, YYLTYPE * const yylocationp<%= output.user_formals %>)
|
@@ -1280,11 +1284,11 @@ switch (yykind)
|
|
1280
1284
|
YY_IGNORE_MAYBE_UNINITIALIZED_END
|
1281
1285
|
}
|
1282
1286
|
|
1283
|
-
static
|
1284
|
-
yy_create_repair_terms(
|
1287
|
+
static yy_repair_terms *
|
1288
|
+
yy_create_repair_terms(yy_repairs *reps<%= output.user_formals %>)
|
1285
1289
|
{
|
1286
|
-
|
1287
|
-
|
1290
|
+
yy_repairs *r = reps;
|
1291
|
+
yy_repair_terms *rep_terms;
|
1288
1292
|
int count = 0;
|
1289
1293
|
|
1290
1294
|
while (r->prev_repair)
|
@@ -1293,7 +1297,7 @@ yy_create_repair_terms(repairs *reps)
|
|
1293
1297
|
r = r->prev_repair;
|
1294
1298
|
}
|
1295
1299
|
|
1296
|
-
rep_terms = (
|
1300
|
+
rep_terms = (yy_repair_terms *) YYMALLOC (sizeof (yy_repair_terms) + sizeof (yy_term) * count);
|
1297
1301
|
rep_terms->id = reps->id;
|
1298
1302
|
rep_terms->length = count;
|
1299
1303
|
|
@@ -1309,46 +1313,46 @@ yy_create_repair_terms(repairs *reps)
|
|
1309
1313
|
}
|
1310
1314
|
|
1311
1315
|
static void
|
1312
|
-
yy_print_repairs(
|
1316
|
+
yy_print_repairs(yy_repairs *reps<%= output.user_formals %>)
|
1313
1317
|
{
|
1314
|
-
|
1318
|
+
yy_repairs *r = reps;
|
1315
1319
|
|
1316
|
-
|
1320
|
+
YYDPRINTF ((stderr,
|
1317
1321
|
"id: %d, repair_length: %d, repair_state: %d, prev_repair_id: %d\n",
|
1318
|
-
reps->id, reps->repair_length, *reps->state, reps->prev_repair->id);
|
1322
|
+
reps->id, reps->repair_length, *reps->state, reps->prev_repair->id));
|
1319
1323
|
|
1320
1324
|
while (r->prev_repair)
|
1321
1325
|
{
|
1322
|
-
|
1326
|
+
YYDPRINTF ((stderr, "%s ", yysymbol_name (r->repair.term)));
|
1323
1327
|
r = r->prev_repair;
|
1324
1328
|
}
|
1325
1329
|
|
1326
|
-
|
1330
|
+
YYDPRINTF ((stderr, "\n"));
|
1327
1331
|
}
|
1328
1332
|
|
1329
1333
|
static void
|
1330
|
-
yy_print_repair_terms(
|
1334
|
+
yy_print_repair_terms(yy_repair_terms *rep_terms<%= output.user_formals %>)
|
1331
1335
|
{
|
1332
1336
|
for (int i = 0; i < rep_terms->length; i++)
|
1333
|
-
|
1337
|
+
YYDPRINTF ((stderr, "%s ", yysymbol_name (rep_terms->terms[i].kind)));
|
1334
1338
|
|
1335
|
-
|
1339
|
+
YYDPRINTF ((stderr, "\n"));
|
1336
1340
|
}
|
1337
1341
|
|
1338
1342
|
static void
|
1339
|
-
yy_free_repairs(
|
1343
|
+
yy_free_repairs(yy_repairs *reps<%= output.user_formals %>)
|
1340
1344
|
{
|
1341
1345
|
while (reps)
|
1342
1346
|
{
|
1343
|
-
|
1347
|
+
yy_repairs *r = reps;
|
1344
1348
|
reps = reps->next;
|
1345
|
-
|
1346
|
-
|
1349
|
+
YYFREE (r->states);
|
1350
|
+
YYFREE (r);
|
1347
1351
|
}
|
1348
1352
|
}
|
1349
1353
|
|
1350
1354
|
static int
|
1351
|
-
yy_process_repairs(
|
1355
|
+
yy_process_repairs(yy_repairs *reps, yysymbol_kind_t token)
|
1352
1356
|
{
|
1353
1357
|
int yyn;
|
1354
1358
|
int yystate = *reps->state;
|
@@ -1417,22 +1421,22 @@ yyrecover_errlab:
|
|
1417
1421
|
return 0;
|
1418
1422
|
}
|
1419
1423
|
|
1420
|
-
static
|
1421
|
-
yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar)
|
1424
|
+
static yy_repair_terms *
|
1425
|
+
yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar<%= output.user_formals %>)
|
1422
1426
|
{
|
1423
1427
|
yysymbol_kind_t yytoken = YYTRANSLATE (yychar);
|
1424
|
-
|
1428
|
+
yy_repair_terms *rep_terms = YY_NULLPTR;
|
1425
1429
|
int count = 0;
|
1426
1430
|
|
1427
|
-
|
1428
|
-
|
1429
|
-
|
1431
|
+
yy_repairs *head = (yy_repairs *) YYMALLOC (sizeof (yy_repairs));
|
1432
|
+
yy_repairs *current = head;
|
1433
|
+
yy_repairs *tail = head;
|
1430
1434
|
YYPTRDIFF_T stack_length = yyssp - yyss + 1;
|
1431
1435
|
|
1432
1436
|
head->id = count;
|
1433
1437
|
head->next = 0;
|
1434
1438
|
head->stack_length = stack_length;
|
1435
|
-
head->states = (yy_state_t *)
|
1439
|
+
head->states = (yy_state_t *) YYMALLOC (sizeof (yy_state_t) * (stack_length));
|
1436
1440
|
head->state = head->states + (yyssp - yyss);
|
1437
1441
|
YYCOPY (head->states, yyss, stack_length);
|
1438
1442
|
head->repair_length = 0;
|
@@ -1456,14 +1460,14 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar)
|
|
1456
1460
|
{
|
1457
1461
|
if (yyx != YYSYMBOL_YYerror)
|
1458
1462
|
{
|
1459
|
-
if (current->repair_length + 1 > YYMAXREPAIR)
|
1463
|
+
if (current->repair_length + 1 > YYMAXREPAIR(<%= output.parse_param_name %>))
|
1460
1464
|
continue;
|
1461
1465
|
|
1462
|
-
|
1466
|
+
yy_repairs *new = (yy_repairs *) YYMALLOC (sizeof (yy_repairs));
|
1463
1467
|
new->id = count;
|
1464
1468
|
new->next = 0;
|
1465
1469
|
new->stack_length = stack_length;
|
1466
|
-
new->states = (yy_state_t *)
|
1470
|
+
new->states = (yy_state_t *) YYMALLOC (sizeof (yy_state_t) * (stack_length));
|
1467
1471
|
new->state = new->states + (current->state - current->states);
|
1468
1472
|
YYCOPY (new->states, current->states, current->state - current->states + 1);
|
1469
1473
|
new->repair_length = current->repair_length + 1;
|
@@ -1474,7 +1478,7 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar)
|
|
1474
1478
|
/* Process PDA assuming next token is yyx */
|
1475
1479
|
if (! yy_process_repairs (new, yyx))
|
1476
1480
|
{
|
1477
|
-
|
1481
|
+
YYFREE (new);
|
1478
1482
|
continue;
|
1479
1483
|
}
|
1480
1484
|
|
@@ -1484,18 +1488,18 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar)
|
|
1484
1488
|
|
1485
1489
|
if (yyx == yytoken)
|
1486
1490
|
{
|
1487
|
-
rep_terms = yy_create_repair_terms (current);
|
1488
|
-
|
1489
|
-
yy_print_repairs (current);
|
1490
|
-
yy_print_repair_terms (rep_terms);
|
1491
|
+
rep_terms = yy_create_repair_terms (current<%= output.user_args %>);
|
1492
|
+
YYDPRINTF ((stderr, "repair_terms found. id: %d, length: %d\n", rep_terms->id, rep_terms->length));
|
1493
|
+
yy_print_repairs (current<%= output.user_args %>);
|
1494
|
+
yy_print_repair_terms (rep_terms<%= output.user_args %>);
|
1491
1495
|
|
1492
1496
|
goto done;
|
1493
1497
|
}
|
1494
1498
|
|
1495
|
-
|
1499
|
+
YYDPRINTF ((stderr,
|
1496
1500
|
"New repairs is enqueued. count: %d, yystate: %d, yyx: %d\n",
|
1497
|
-
count, yystate, yyx);
|
1498
|
-
yy_print_repairs (new);
|
1501
|
+
count, yystate, yyx));
|
1502
|
+
yy_print_repairs (new<%= output.user_args %>);
|
1499
1503
|
}
|
1500
1504
|
}
|
1501
1505
|
}
|
@@ -1505,11 +1509,11 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar)
|
|
1505
1509
|
|
1506
1510
|
done:
|
1507
1511
|
|
1508
|
-
yy_free_repairs(head);
|
1512
|
+
yy_free_repairs(head<%= output.user_args %>);
|
1509
1513
|
|
1510
1514
|
if (!rep_terms)
|
1511
1515
|
{
|
1512
|
-
|
1516
|
+
YYDPRINTF ((stderr, "repair_terms not found\n"));
|
1513
1517
|
}
|
1514
1518
|
|
1515
1519
|
return rep_terms;
|
@@ -1586,7 +1590,7 @@ YYLTYPE yylloc = yyloc_default;
|
|
1586
1590
|
/* The locations where the error started and ended. */
|
1587
1591
|
YYLTYPE yyerror_range[3];
|
1588
1592
|
<%- if output.error_recovery -%>
|
1589
|
-
|
1593
|
+
yy_repair_terms *rep_terms = 0;
|
1590
1594
|
yy_term term_backup;
|
1591
1595
|
int rep_terms_index;
|
1592
1596
|
int yychar_backup;
|
@@ -1726,32 +1730,35 @@ yybackup:
|
|
1726
1730
|
/* Not known => get a lookahead token if don't already have one. */
|
1727
1731
|
|
1728
1732
|
<%- if output.error_recovery -%>
|
1729
|
-
if (
|
1733
|
+
if (YYERROR_RECOVERY_ENABLED(<%= output.parse_param_name %>))
|
1730
1734
|
{
|
1731
|
-
|
1732
|
-
if (rep_terms_index < rep_terms->length)
|
1733
|
-
{
|
1734
|
-
YYDPRINTF ((stderr, "An error recovery token is used\n"));
|
1735
|
-
yy_term term = rep_terms->terms[rep_terms_index];
|
1736
|
-
yytoken = term.kind;
|
1737
|
-
yylval = term.value;
|
1738
|
-
yylloc = term.location;
|
1739
|
-
yychar = yytranslate_inverted[yytoken];
|
1740
|
-
YY_SYMBOL_PRINT ("Next error recovery token is", yytoken, &yylval, &yylloc<%= output.user_args %>);
|
1741
|
-
rep_terms_index++;
|
1742
|
-
}
|
1743
|
-
else
|
1735
|
+
if (yychar == YYEMPTY && rep_terms)
|
1744
1736
|
{
|
1745
|
-
|
1746
|
-
|
1747
|
-
|
1748
|
-
|
1749
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1737
|
+
|
1738
|
+
if (rep_terms_index < rep_terms->length)
|
1739
|
+
{
|
1740
|
+
YYDPRINTF ((stderr, "An error recovery token is used\n"));
|
1741
|
+
yy_term term = rep_terms->terms[rep_terms_index];
|
1742
|
+
yytoken = term.kind;
|
1743
|
+
yylval = term.value;
|
1744
|
+
yylloc = term.location;
|
1745
|
+
yychar = yytranslate_inverted[yytoken];
|
1746
|
+
YY_SYMBOL_PRINT ("Next error recovery token is", yytoken, &yylval, &yylloc<%= output.user_args %>);
|
1747
|
+
rep_terms_index++;
|
1748
|
+
}
|
1749
|
+
else
|
1750
|
+
{
|
1751
|
+
YYDPRINTF ((stderr, "Error recovery is completed\n"));
|
1752
|
+
yytoken = term_backup.kind;
|
1753
|
+
yylval = term_backup.value;
|
1754
|
+
yylloc = term_backup.location;
|
1755
|
+
yychar = yychar_backup;
|
1756
|
+
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc<%= output.user_args %>);
|
1757
|
+
|
1758
|
+
YYFREE (rep_terms);
|
1759
|
+
rep_terms = 0;
|
1760
|
+
yychar_backup = 0;
|
1761
|
+
}
|
1755
1762
|
}
|
1756
1763
|
}
|
1757
1764
|
<%- end -%>
|
@@ -1980,27 +1987,28 @@ yyerrorlab:
|
|
1980
1987
|
`-------------------------------------------------------------*/
|
1981
1988
|
yyerrlab1:
|
1982
1989
|
<%- if output.error_recovery -%>
|
1983
|
-
|
1984
|
-
|
1985
|
-
|
1986
|
-
|
1987
|
-
|
1988
|
-
|
1989
|
-
|
1990
|
-
|
1991
|
-
|
1990
|
+
if (YYERROR_RECOVERY_ENABLED(<%= output.parse_param_name %>))
|
1991
|
+
{
|
1992
|
+
rep_terms = yyrecover (yyss, yyssp, yychar<%= output.user_args %>);
|
1993
|
+
if (rep_terms)
|
1994
|
+
{
|
1995
|
+
for (int i = 0; i < rep_terms->length; i++)
|
1996
|
+
{
|
1997
|
+
yy_term *term = &rep_terms->terms[i];
|
1998
|
+
yy_error_token_initialize (term->kind, &term->value, &term->location<%= output.user_args %>);
|
1999
|
+
}
|
1992
2000
|
|
1993
|
-
|
1994
|
-
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
2001
|
+
yychar_backup = yychar;
|
2002
|
+
/* Can be packed into (the tail of) rep_terms? */
|
2003
|
+
term_backup.kind = yytoken;
|
2004
|
+
term_backup.value = yylval;
|
2005
|
+
term_backup.location = yylloc;
|
2006
|
+
rep_terms_index = 0;
|
2007
|
+
yychar = YYEMPTY;
|
2000
2008
|
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2009
|
+
goto yybackup;
|
2010
|
+
}
|
2011
|
+
}
|
2004
2012
|
<%- end -%>
|
2005
2013
|
yyerrstatus = 3; /* Each real token shifted decrements this. */
|
2006
2014
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lrama
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuichiro Kaneko
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: LALR (1) parser generator written by Ruby
|
14
14
|
email:
|
@@ -34,8 +34,15 @@ files:
|
|
34
34
|
- lib/lrama/bitmap.rb
|
35
35
|
- lib/lrama/command.rb
|
36
36
|
- lib/lrama/context.rb
|
37
|
+
- lib/lrama/counterexamples.rb
|
38
|
+
- lib/lrama/counterexamples/derivation.rb
|
39
|
+
- lib/lrama/counterexamples/example.rb
|
40
|
+
- lib/lrama/counterexamples/path.rb
|
41
|
+
- lib/lrama/counterexamples/state_item.rb
|
42
|
+
- lib/lrama/counterexamples/triple.rb
|
37
43
|
- lib/lrama/digraph.rb
|
38
44
|
- lib/lrama/grammar.rb
|
45
|
+
- lib/lrama/grammar/auxiliary.rb
|
39
46
|
- lib/lrama/grammar/code.rb
|
40
47
|
- lib/lrama/grammar/error_token.rb
|
41
48
|
- lib/lrama/grammar/precedence.rb
|
@@ -46,6 +53,7 @@ files:
|
|
46
53
|
- lib/lrama/grammar/union.rb
|
47
54
|
- lib/lrama/lexer.rb
|
48
55
|
- lib/lrama/lexer/token.rb
|
56
|
+
- lib/lrama/lexer/token/type.rb
|
49
57
|
- lib/lrama/output.rb
|
50
58
|
- lib/lrama/parser.rb
|
51
59
|
- lib/lrama/parser/token_scanner.rb
|
@@ -54,11 +62,14 @@ files:
|
|
54
62
|
- lib/lrama/report/profile.rb
|
55
63
|
- lib/lrama/state.rb
|
56
64
|
- lib/lrama/state/reduce.rb
|
65
|
+
- lib/lrama/state/reduce_reduce_conflict.rb
|
57
66
|
- lib/lrama/state/resolved_conflict.rb
|
58
67
|
- lib/lrama/state/shift.rb
|
68
|
+
- lib/lrama/state/shift_reduce_conflict.rb
|
59
69
|
- lib/lrama/states.rb
|
60
70
|
- lib/lrama/states/item.rb
|
61
71
|
- lib/lrama/states_reporter.rb
|
72
|
+
- lib/lrama/type.rb
|
62
73
|
- lib/lrama/version.rb
|
63
74
|
- lib/lrama/warning.rb
|
64
75
|
- lrama.gemspec
|