lrama 0.5.3 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|