This commit is contained in:
Joshua Batson 2014-04-06 23:09:45 -04:00
parent b51dbfe2a0
commit 4fdd08f1d1
15 changed files with 571 additions and 450 deletions

View File

@ -1,5 +1,5 @@
devel = 0
devel = 1
BISON = bison
FLEX = flex

55
kk.cpp
View File

@ -539,6 +539,39 @@ compute_sq2 ()
sage_show_khsq (outfp, H, sq1, sq2);
}
unsigned
kh_rk (knot_diagram kd)
{
cube<Z2> c (kd);
mod_map<Z2> d = c.compute_d (1, 0, 0, 0, 0);
chain_complex_simplifier<Z2> s (c.khC, d, maybe<int> (1), maybe<int> (0));
assert (s.new_d == 0);
return s.new_C->free_rank();
}
void
run_demo ()
{
printf ("Link \t\t L1 \t L2 \t L \n");
for (unsigned i = 10; i <= 11; i ++)
{
for (unsigned j = 90; j <= fmin(mt_links (i, 0), 230); j ++)
{
knot_diagram kd (mt_link (i, 0, j));
if (kd.num_components () != 2)
continue;
knot_diagram L1 (SUBLINK, smallbitset (2, 1), kd);
knot_diagram L2 (SUBLINK, smallbitset (2, 2), kd);
printf ("%s \t %d \t %d \t %d \n", kd.name.c_str(), kh_rk(L1), kh_rk(L2), kh_rk(kd));
}
}
}
int
main (int argc, char **argv)
{
@ -557,6 +590,11 @@ main (int argc, char **argv)
usage ();
exit (EXIT_SUCCESS);
}
else if (strcmp (argv[i], "-demo") == 0)
{
run_demo();
exit (EXIT_SUCCESS);
}
else if (!strcmp (argv[i], "-v"))
verbose = 1;
else if (!strcmp (argv[i], "-f"))
@ -626,6 +664,23 @@ main (int argc, char **argv)
kd = parse_knot (knot);
kd.marked_edge = 1;
if (!strcmp (invariant, "gauss"))
{
basedvector<basedvector<int, 1>, 1> gc = kd.as_gauss_code ();
for (unsigned i = 1; i <= gc.size (); i ++)
{
if (i > 1)
printf (":");
for (unsigned j = 1; j <= gc[i].size (); j ++)
{
if (j > 1)
printf (",");
printf ("%d", gc[i][j]);
}
}
newline ();
}
if (!strcmp (invariant, "sq2"))
{
if (strcmp (field, "Z2"))

View File

@ -1040,6 +1040,59 @@ knot_diagram::planar_diagram_crossings () const
return r;
}
basedvector<basedvector<int, 1>, 1>
knot_diagram::as_gauss_code () const
{
set<unsigned> visited;
unsigned m = num_components ();
basedvector<basedvector<int, 1>, 1> gc (m);
unsigned k = 0; // index component
for (unsigned i = 1; i <= num_edges (); i ++)
{
if (visited % i)
continue;
basedvector<int, 1> comp_gc;
unsigned p = edge_to_ept (i);
for (unsigned j = i;;)
{
visited.push (j);
unsigned c = ept_crossing[p];
int t = (is_over_ept (p)
? -c
: c);
comp_gc.append (t);
p = crossings[c][add_base1_mod4 (ept_index[p], 2)];
p = edge_other_ept (p);
assert (is_to_ept (p));
j = ept_edge (p);
if (j == i)
break;
}
++ k;
gc[k] = comp_gc;
}
assert (visited.card () == num_edges ());
#ifndef NDEBUG
unsigned n = 0;
for (unsigned i = 1; i <= m; i ++)
n += gc[i].size ();
assert (n == 2*n_crossings);
#endif
return gc;
}
hash_t
knot_diagram::hash_self () const
{

View File

@ -175,6 +175,8 @@ class knot_diagram
basedvector<basedvector<int, 1>, 1> planar_diagram_crossings () const;
basedvector<basedvector<int, 1>, 1> as_gauss_code () const;
hash_t hash_self () const;
void show_ept (unsigned p) const;

View File

@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.6.5. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Skeleton implementation for Bison LALR(1) parsers in C++
@ -33,7 +33,7 @@
/* First part of user declarations. */
/* Line 278 of lalr1.cc */
/* Line 279 of lalr1.cc */
#line 38 "knot_parser/knot_parser.cc"
@ -41,23 +41,23 @@
/* User implementation prologue. */
/* Line 284 of lalr1.cc */
/* Line 285 of lalr1.cc */
#line 46 "knot_parser/knot_parser.cc"
/* Unqualified %code blocks. */
/* Line 285 of lalr1.cc */
/* Line 286 of lalr1.cc */
#line 15 "knot_parser/knot_parser.yy"
#define YY_DECL \
yy::knot_parser::token_type knot_yylex (yy::knot_parser::semantic_type *yylval)
YY_DECL;
/* Line 285 of lalr1.cc */
/* Line 286 of lalr1.cc */
#line 30 "knot_parser/knot_parser.yy"
#define yylex knot_yylex
/* Line 285 of lalr1.cc */
/* Line 286 of lalr1.cc */
#line 62 "knot_parser/knot_parser.cc"
@ -136,9 +136,9 @@ do { \
#else /* !YYDEBUG */
# define YYCDEBUG if (false) std::cerr
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
# define YY_REDUCE_PRINT(Rule)
# define YY_STACK_PRINT()
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type)
# define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
# define YY_STACK_PRINT() static_cast<void>(0)
#endif /* !YYDEBUG */
@ -152,7 +152,7 @@ do { \
namespace yy {
/* Line 352 of lalr1.cc */
/* Line 353 of lalr1.cc */
#line 157 "knot_parser/knot_parser.cc"
/// Build a parser object.
@ -212,7 +212,8 @@ namespace yy {
YYUSE (yymsg);
YYUSE (yyvaluep);
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
if (yymsg)
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
@ -300,6 +301,10 @@ namespace yy {
int yyresult;
// FIXME: This shoud be completely indented. It is not yet to
// avoid gratuitous conflicts when merging into the master branch.
try
{
YYCDEBUG << "Starting parse" << std::endl;
@ -335,8 +340,8 @@ namespace yy {
/* Read a lookahead token. */
if (yychar == yyempty_)
{
YYCDEBUG << "Reading a token: ";
yychar = yylex (&yylval);
YYCDEBUG << "Reading a token: ";
yychar = yylex (&yylval);
}
/* Convert token to internal form. */
@ -409,15 +414,18 @@ namespace yy {
else
yyval = yysemantic_stack_[0];
// Compute the default @$.
{
slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
YYLLOC_DEFAULT (yyloc, slice, yylen);
}
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
case 2:
/* Line 661 of lalr1.cc */
case 2:
/* Line 670 of lalr1.cc */
#line 60 "knot_parser/knot_parser.yy"
{
parsed_knot = *(yysemantic_stack_[(1) - (1)].kd);
@ -426,7 +434,7 @@ namespace yy {
break;
case 4:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 69 "knot_parser/knot_parser.yy"
{
(yyval.kd) = new knot_diagram (DISJOINT_UNION, *(yysemantic_stack_[(2) - (1)].kd), *(yysemantic_stack_[(2) - (2)].kd));
@ -436,7 +444,7 @@ namespace yy {
break;
case 13:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 89 "knot_parser/knot_parser.yy"
{
unsigned n = (yysemantic_stack_[(3) - (1)].integer),
@ -455,7 +463,7 @@ namespace yy {
break;
case 14:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 107 "knot_parser/knot_parser.yy"
{
unsigned n = (yysemantic_stack_[(3) - (1)].integer),
@ -475,7 +483,7 @@ namespace yy {
break;
case 15:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 126 "knot_parser/knot_parser.yy"
{
unsigned n = (yysemantic_stack_[(4) - (2)].integer),
@ -495,19 +503,19 @@ namespace yy {
break;
case 16:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 145 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (planar_diagram ("<parsed>", *(yysemantic_stack_[(4) - (3)].int_vec2))); }
break;
case 17:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 147 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (planar_diagram ("<parsed>", *(yysemantic_stack_[(4) - (3)].int_vec2))); }
break;
case 18:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 152 "knot_parser/knot_parser.yy"
{
basedvector<basedvector<int, 1>, 1> even_labels (1);
@ -517,31 +525,31 @@ namespace yy {
break;
case 19:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 158 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (dt_code ("<parsed>", *(yysemantic_stack_[(4) - (3)].int_vec2))); }
break;
case 20:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 160 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (dt_code ("<parsed>", (yysemantic_stack_[(4) - (3)].string))); }
break;
case 21:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 165 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (torus_knot ((yysemantic_stack_[(6) - (3)].integer), (yysemantic_stack_[(6) - (5)].integer))); }
break;
case 22:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 170 "knot_parser/knot_parser.yy"
{ (yyval.kd) = new knot_diagram (braid ((yysemantic_stack_[(6) - (3)].integer), *(yysemantic_stack_[(6) - (5)].int_vec))); }
break;
case 23:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 175 "knot_parser/knot_parser.yy"
{
unsigned unknot_ar[1][4] = {
@ -552,7 +560,7 @@ namespace yy {
break;
case 26:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 190 "knot_parser/knot_parser.yy"
{
basedvector<basedvector<int, 1>, 1> *v
@ -563,7 +571,7 @@ namespace yy {
break;
case 27:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 197 "knot_parser/knot_parser.yy"
{
basedvector<basedvector<int, 1>, 1> *v = (yysemantic_stack_[(3) - (1)].int_vec2);
@ -573,19 +581,19 @@ namespace yy {
break;
case 28:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 206 "knot_parser/knot_parser.yy"
{ (yyval.int_vec) = (yysemantic_stack_[(3) - (2)].int_vec); }
break;
case 29:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 208 "knot_parser/knot_parser.yy"
{ (yyval.int_vec) = (yysemantic_stack_[(3) - (2)].int_vec); }
break;
case 30:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 213 "knot_parser/knot_parser.yy"
{
basedvector<int, 1> *v =
@ -596,7 +604,7 @@ namespace yy {
break;
case 31:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 220 "knot_parser/knot_parser.yy"
{
basedvector<int, 1> *v = (yysemantic_stack_[(3) - (1)].int_vec);
@ -606,7 +614,7 @@ namespace yy {
break;
case 32:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 229 "knot_parser/knot_parser.yy"
{
basedvector<basedvector<int, 1>, 1> *v
@ -617,7 +625,7 @@ namespace yy {
break;
case 33:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 236 "knot_parser/knot_parser.yy"
{
basedvector<basedvector<int, 1>, 1> *v = (yysemantic_stack_[(3) - (1)].int_vec2);
@ -627,7 +635,7 @@ namespace yy {
break;
case 34:
/* Line 661 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 245 "knot_parser/knot_parser.yy"
{
basedvector<int, 1> *v
@ -641,11 +649,12 @@ namespace yy {
break;
/* Line 661 of lalr1.cc */
#line 646 "knot_parser/knot_parser.cc"
default:
break;
/* Line 670 of lalr1.cc */
#line 654 "knot_parser/knot_parser.cc"
default:
break;
}
/* User semantic actions sometimes alter yychar, and that requires
that yytoken be updated with the new translation. We take the
approach of translating immediately before every use of yytoken.
@ -696,20 +705,19 @@ namespace yy {
yyerror_range[1] = yylloc;
if (yyerrstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= yyeof_)
{
/* Return failure if at end of input. */
if (yychar == yyeof_)
YYABORT;
}
else
{
yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
yychar = yyempty_;
}
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= yyeof_)
{
/* Return failure if at end of input. */
if (yychar == yyeof_)
YYABORT;
}
else
{
yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
yychar = yyempty_;
}
}
/* Else will try to reuse lookahead token after shifting the error
@ -758,7 +766,7 @@ namespace yy {
/* Pop the current state because it cannot handle the error token. */
if (yystate_stack_.height () == 1)
YYABORT;
YYABORT;
yyerror_range[1] = yylocation_stack_[0];
yydestruct_ ("Error: popping",
@ -806,16 +814,42 @@ namespace yy {
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
yypop_ (yylen);
while (yystate_stack_.height () != 1)
while (1 < yystate_stack_.height ())
{
yydestruct_ ("Cleanup: popping",
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
yydestruct_ ("Cleanup: popping",
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
}
return yyresult;
}
catch (...)
{
YYCDEBUG << "Exception caught: cleaning lookahead and stack"
<< std::endl;
// Do not try to display the values of the reclaimed symbols,
// as their printer might throw an exception.
if (yychar != yyempty_)
{
/* Make sure we have latest lookahead translation. See
comments at user semantic actions for why this is
necessary. */
yytoken = yytranslate_ (yychar);
yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc);
}
while (1 < yystate_stack_.height ())
{
yydestruct_ (YY_NULL,
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
}
throw;
}
}
// Generate an error message.
@ -1094,9 +1128,9 @@ namespace yy {
} // yy
/* Line 1106 of lalr1.cc */
#line 1099 "knot_parser/knot_parser.cc"
/* Line 1107 of lalr1.cc */
/* Line 1141 of lalr1.cc */
#line 1133 "knot_parser/knot_parser.cc"
/* Line 1142 of lalr1.cc */
#line 255 "knot_parser/knot_parser.yy"

View File

@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.6.5. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Skeleton interface for Bison LALR(1) parsers in C++
@ -41,13 +41,13 @@
# define YY_YY_KNOT_PARSER_KNOT_PARSER_HH_INCLUDED
/* "%code requires" blocks. */
/* Line 36 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 11 "knot_parser/knot_parser.yy"
#include <knotkit.h>
/* Line 36 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 52 "knot_parser/knot_parser.hh"
@ -63,7 +63,7 @@
namespace yy {
/* Line 36 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 68 "knot_parser/knot_parser.hh"
/// A Bison parser.
@ -74,7 +74,7 @@ namespace yy {
#ifndef YYSTYPE
union semantic_type
{
/* Line 36 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 21 "knot_parser/knot_parser.yy"
int integer;
@ -85,7 +85,7 @@ namespace yy {
knot_diagram *kd;
/* Line 36 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 90 "knot_parser/knot_parser.hh"
};
#else
@ -254,6 +254,7 @@ namespace yy {
/// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed.
/// If null, do not display the symbol, just free it.
/// \param yytype The symbol type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
@ -283,8 +284,8 @@ namespace yy {
};
} // yy
/* Line 36 of lalr1.cc */
#line 288 "knot_parser/knot_parser.hh"
/* Line 33 of lalr1.cc */
#line 289 "knot_parser/knot_parser.hh"

View File

@ -66,6 +66,7 @@ typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
typedef uint64_t flex_uint64_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
@ -172,7 +173,12 @@ typedef unsigned int flex_uint32_t;
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif
extern int knot_yyleng;
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
extern yy_size_t knot_yyleng;
extern FILE *knot_yyin, *knot_yyout;
@ -198,11 +204,6 @@ extern FILE *knot_yyin, *knot_yyout;
#define unput(c) yyunput( c, (yytext_ptr) )
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
@ -220,7 +221,7 @@ struct yy_buffer_state
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
int yy_n_chars;
yy_size_t yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
@ -290,8 +291,8 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
/* yy_hold_char holds the character lost when knot_yytext is formed. */
static char yy_hold_char;
static int yy_n_chars; /* number of characters read into yy_ch_buf */
int knot_yyleng;
static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
yy_size_t knot_yyleng;
/* Points to current character in buffer. */
static char *yy_c_buf_p = (char *) 0;
@ -319,7 +320,7 @@ static void knot_yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
YY_BUFFER_STATE knot_yy_scan_buffer (char *base,yy_size_t size );
YY_BUFFER_STATE knot_yy_scan_string (yyconst char *yy_str );
YY_BUFFER_STATE knot_yy_scan_bytes (yyconst char *bytes,int len );
YY_BUFFER_STATE knot_yy_scan_bytes (yyconst char *bytes,yy_size_t len );
void *knot_yyalloc (yy_size_t );
void *knot_yyrealloc (void *,yy_size_t );
@ -377,7 +378,7 @@ static void yy_fatal_error (yyconst char msg[] );
*/
#define YY_DO_BEFORE_ACTION \
(yytext_ptr) = yy_bp; \
knot_yyleng = (size_t) (yy_cp - yy_bp); \
knot_yyleng = (yy_size_t) (yy_cp - yy_bp); \
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
@ -483,7 +484,7 @@ char *knot_yytext;
typedef yy::knot_parser::token token;
typedef yy::knot_parser::token_type token_type;
#line 487 "knot_parser/knot_scanner.cc"
#line 488 "knot_parser/knot_scanner.cc"
#define INITIAL 0
@ -522,7 +523,7 @@ FILE *knot_yyget_out (void );
void knot_yyset_out (FILE * out_str );
int knot_yyget_leng (void );
yy_size_t knot_yyget_leng (void );
char *knot_yyget_text (void );
@ -581,7 +582,7 @@ static int input (void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
int n; \
yy_size_t n; \
for ( n = 0; n < max_size && \
(c = getc( knot_yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@ -666,7 +667,7 @@ YY_DECL
#line 16 "knot_parser/knot_scanner.ll"
#line 670 "knot_parser/knot_scanner.cc"
#line 671 "knot_parser/knot_scanner.cc"
if ( !(yy_init) )
{
@ -808,7 +809,7 @@ YY_RULE_SETUP
#line 63 "knot_parser/knot_scanner.ll"
ECHO;
YY_BREAK
#line 812 "knot_parser/knot_scanner.cc"
#line 813 "knot_parser/knot_scanner.cc"
case YY_STATE_EOF(INITIAL):
yyterminate();
@ -995,7 +996,7 @@ static int yy_get_next_buffer (void)
else
{
int num_to_read =
yy_size_t num_to_read =
YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
while ( num_to_read <= 0 )
@ -1009,7 +1010,7 @@ static int yy_get_next_buffer (void)
if ( b->yy_is_our_buffer )
{
int new_size = b->yy_buf_size * 2;
yy_size_t new_size = b->yy_buf_size * 2;
if ( new_size <= 0 )
b->yy_buf_size += b->yy_buf_size / 8;
@ -1040,7 +1041,7 @@ static int yy_get_next_buffer (void)
/* Read in more data. */
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
(yy_n_chars), (size_t) num_to_read );
(yy_n_chars), num_to_read );
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
}
@ -1162,7 +1163,7 @@ static int yy_get_next_buffer (void)
else
{ /* need more input */
int offset = (yy_c_buf_p) - (yytext_ptr);
yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
++(yy_c_buf_p);
switch ( yy_get_next_buffer( ) )
@ -1186,7 +1187,7 @@ static int yy_get_next_buffer (void)
case EOB_ACT_END_OF_FILE:
{
if ( knot_yywrap( ) )
return EOF;
return 0;
if ( ! (yy_did_buffer_switch_on_eof) )
YY_NEW_FILE;
@ -1438,7 +1439,7 @@ void knot_yypop_buffer_state (void)
*/
static void knot_yyensure_buffer_stack (void)
{
int num_to_alloc;
yy_size_t num_to_alloc;
if (!(yy_buffer_stack)) {
@ -1535,12 +1536,11 @@ YY_BUFFER_STATE knot_yy_scan_string (yyconst char * yystr )
*
* @return the newly allocated buffer state object.
*/
YY_BUFFER_STATE knot_yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
YY_BUFFER_STATE knot_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
{
YY_BUFFER_STATE b;
char *buf;
yy_size_t n;
int i;
yy_size_t n, i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
@ -1622,7 +1622,7 @@ FILE *knot_yyget_out (void)
/** Get the length of the current token.
*
*/
int knot_yyget_leng (void)
yy_size_t knot_yyget_leng (void)
{
return knot_yyleng;
}

View File

@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.6.5. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Locations for Bison parsers in C++
@ -42,7 +42,7 @@
namespace yy {
/* Line 164 of location.cc */
/* Line 166 of location.cc */
#line 47 "knot_parser/location.hh"
/// Abstract a location.
@ -156,7 +156,9 @@ namespace yy {
**
** Avoid duplicate information.
*/
inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
template <typename YYChar>
inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
{
position last = loc.end - 1;
ostr << loc.begin;
@ -173,7 +175,7 @@ namespace yy {
} // yy
/* Line 292 of location.cc */
#line 178 "knot_parser/location.hh"
/* Line 296 of location.cc */
#line 180 "knot_parser/location.hh"
#endif /* !YY_YY_KNOT_PARSER_LOCATION_HH_INCLUDED */

View File

@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.6.5. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Positions for Bison parsers in C++
@ -52,7 +52,7 @@
namespace yy {
/* Line 38 of location.cc */
/* Line 36 of location.cc */
#line 57 "knot_parser/position.hh"
/// Abstract a position.
class position
@ -156,8 +156,9 @@ namespace yy {
** \param ostr the destination output stream
** \param pos a reference to the position to redirect
*/
inline std::ostream&
operator<< (std::ostream& ostr, const position& pos)
template <typename YYChar>
inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
{
if (pos.filename)
ostr << *pos.filename << ':';
@ -166,6 +167,6 @@ namespace yy {
} // yy
/* Line 149 of location.cc */
#line 171 "knot_parser/position.hh"
/* Line 148 of location.cc */
#line 172 "knot_parser/position.hh"
#endif /* !YY_YY_KNOT_PARSER_POSITION_HH_INCLUDED */

View File

@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.6.5. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Stack handling for Bison parsers in C++
@ -42,7 +42,7 @@
namespace yy {
/* Line 37 of stack.hh */
/* Line 34 of stack.hh */
#line 47 "knot_parser/stack.hh"
template <class T, class S = std::deque<T> >
class stack
@ -127,7 +127,7 @@ namespace yy {
};
} // yy
/* Line 119 of stack.hh */
/* Line 116 of stack.hh */
#line 132 "knot_parser/stack.hh"
#endif /* !YY_YY_KNOT_PARSER_STACK_HH_INCLUDED */

View File

@ -1,9 +1,8 @@
/* A Bison parser, made by GNU Bison 2.4.3. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Locations for Bison parsers in C++
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software
Foundation, Inc.
Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -32,39 +31,55 @@
version 2.2 of Bison. */
/**
** \file location.hh
** \file rd_parser/location.hh
** Define the yy::location class.
*/
#ifndef BISON_LOCATION_HH
# define BISON_LOCATION_HH
#ifndef YY_YY_RD_PARSER_LOCATION_HH_INCLUDED
# define YY_YY_RD_PARSER_LOCATION_HH_INCLUDED
# include <iostream>
# include <string>
# include "position.hh"
namespace yy {
/* Line 163 of location.cc */
#line 51 "rd_parser/location.hh"
/* Line 166 of location.cc */
#line 47 "rd_parser/location.hh"
/// Abstract a location.
class location
{
public:
/// Construct a location.
location ()
: begin (), end ()
/// Construct a location from \a b to \a e.
location (const position& b, const position& e)
: begin (b)
, end (e)
{
}
/// Construct a 0-width location in \a p.
explicit location (const position& p = position ())
: begin (p)
, end (p)
{
}
/// Construct a 0-width location in \a f, \a l, \a c.
explicit location (std::string* f,
unsigned int l = 1u,
unsigned int c = 1u)
: begin (f, l, c)
, end (f, l, c)
{
}
/// Initialization.
inline void initialize (std::string* fn)
void initialize (std::string* f = YY_NULL,
unsigned int l = 1u,
unsigned int c = 1u)
{
begin.initialize (fn);
begin.initialize (f, l, c);
end = begin;
}
@ -72,19 +87,19 @@ namespace yy {
** \{ */
public:
/// Reset initial location to final location.
inline void step ()
void step ()
{
begin = end;
}
/// Extend the current location to the COUNT next columns.
inline void columns (unsigned int count = 1)
void columns (unsigned int count = 1)
{
end += count;
}
/// Extend the current location to the COUNT next lines.
inline void lines (unsigned int count = 1)
void lines (unsigned int count = 1)
{
end.lines (count);
}
@ -141,7 +156,9 @@ namespace yy {
**
** Avoid duplicate information.
*/
inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
template <typename YYChar>
inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
{
position last = loc.end - 1;
ostr << loc.begin;
@ -158,8 +175,7 @@ namespace yy {
} // yy
/* Line 296 of location.cc */
#line 180 "rd_parser/location.hh"
/* Line 272 of location.cc */
#line 164 "rd_parser/location.hh"
#endif // not BISON_LOCATION_HH
#endif /* !YY_YY_RD_PARSER_LOCATION_HH_INCLUDED */

View File

@ -1,9 +1,8 @@
/* A Bison parser, made by GNU Bison 2.4.3. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Positions for Bison parsers in C++
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software
Foundation, Inc.
Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -32,60 +31,71 @@
version 2.2 of Bison. */
/**
** \file position.hh
** \file rd_parser/position.hh
** Define the yy::position class.
*/
#ifndef BISON_POSITION_HH
# define BISON_POSITION_HH
#ifndef YY_YY_RD_PARSER_POSITION_HH_INCLUDED
# define YY_YY_RD_PARSER_POSITION_HH_INCLUDED
# include <algorithm> // std::max
# include <iostream>
# include <string>
# include <algorithm>
# ifndef YY_NULL
# if defined __cplusplus && 201103L <= __cplusplus
# define YY_NULL nullptr
# else
# define YY_NULL 0
# endif
# endif
namespace yy {
/* Line 38 of location.cc */
#line 51 "rd_parser/position.hh"
/* Line 36 of location.cc */
#line 57 "rd_parser/position.hh"
/// Abstract a position.
class position
{
public:
/// Construct a position.
position ()
: filename (0), line (1), column (1)
explicit position (std::string* f = YY_NULL,
unsigned int l = 1u,
unsigned int c = 1u)
: filename (f)
, line (l)
, column (c)
{
}
/// Initialization.
inline void initialize (std::string* fn)
void initialize (std::string* fn = YY_NULL,
unsigned int l = 1u,
unsigned int c = 1u)
{
filename = fn;
line = 1;
column = 1;
line = l;
column = c;
}
/** \name Line and Column related manipulators
** \{ */
public:
/// (line related) Advance to the COUNT next lines.
inline void lines (int count = 1)
void lines (int count = 1)
{
column = 1;
column = 1u;
line += count;
}
/// (column related) Advance to the COUNT next columns.
inline void columns (int count = 1)
void columns (int count = 1)
{
column = std::max (1u, column + count);
}
/** \} */
public:
/// File name to which this position refers.
std::string* filename;
/// Current line number.
@ -95,7 +105,7 @@ namespace yy {
};
/// Add and assign a position.
inline const position&
inline position&
operator+= (position& res, const int width)
{
res.columns (width);
@ -111,7 +121,7 @@ namespace yy {
}
/// Add and assign a position.
inline const position&
inline position&
operator-= (position& res, const int width)
{
return res += -width;
@ -146,8 +156,9 @@ namespace yy {
** \param ostr the destination output stream
** \param pos a reference to the position to redirect
*/
inline std::ostream&
operator<< (std::ostream& ostr, const position& pos)
template <typename YYChar>
inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
{
if (pos.filename)
ostr << *pos.filename << ':';
@ -156,7 +167,6 @@ namespace yy {
} // yy
/* Line 145 of location.cc */
#line 162 "rd_parser/position.hh"
#endif // not BISON_POSITION_HH
/* Line 148 of location.cc */
#line 172 "rd_parser/position.hh"
#endif /* !YY_YY_RD_PARSER_POSITION_HH_INCLUDED */

View File

@ -1,9 +1,8 @@
/* A Bison parser, made by GNU Bison 2.4.3. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Skeleton implementation for Bison LALR(1) parsers in C++
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
Software Foundation, Inc.
Copyright (C) 2002-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -34,21 +33,18 @@
/* First part of user declarations. */
/* Line 311 of lalr1.cc */
#line 40 "rd_parser/rd_parser.cc"
/* Line 279 of lalr1.cc */
#line 38 "rd_parser/rd_parser.cc"
#include "rd_parser.hh"
/* User implementation prologue. */
/* Line 317 of lalr1.cc */
#line 49 "rd_parser/rd_parser.cc"
/* Line 285 of lalr1.cc */
#line 46 "rd_parser/rd_parser.cc"
/* Unqualified %code blocks. */
/* Line 318 of lalr1.cc */
/* Line 286 of lalr1.cc */
#line 15 "rd_parser/rd_parser.yy"
#define YY_DECL \
@ -59,16 +55,23 @@ YY_DECL;
#define CPT_MARKED 0x10000
#define CPT_MARKED2 0x20000
/* Line 318 of lalr1.cc */
/* Line 286 of lalr1.cc */
#line 32 "rd_parser/rd_parser.yy"
#define yylex rd_yylex
/* Line 286 of lalr1.cc */
#line 66 "rd_parser/rd_parser.cc"
/* Line 318 of lalr1.cc */
#line 72 "rd_parser/rd_parser.cc"
# ifndef YY_NULL
# if defined __cplusplus && 201103L <= __cplusplus
# define YY_NULL nullptr
# else
# define YY_NULL 0
# endif
# endif
#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
@ -82,6 +85,27 @@ YY_DECL;
# endif
#endif
#define YYRHSLOC(Rhs, K) ((Rhs)[K])
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
# ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do \
if (N) \
{ \
(Current).begin = YYRHSLOC (Rhs, 1).begin; \
(Current).end = YYRHSLOC (Rhs, N).end; \
} \
else \
{ \
(Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
} \
while (/*CONSTCOND*/ false)
# endif
/* Suppress unused-variable warnings by "using" E. */
#define YYUSE(e) ((void) (e))
@ -116,9 +140,9 @@ do { \
#else /* !YYDEBUG */
# define YYCDEBUG if (false) std::cerr
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
# define YY_REDUCE_PRINT(Rule)
# define YY_STACK_PRINT()
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type)
# define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
# define YY_STACK_PRINT() static_cast<void>(0)
#endif /* !YYDEBUG */
@ -132,49 +156,8 @@ do { \
namespace yy {
/* Line 380 of lalr1.cc */
#line 138 "rd_parser/rd_parser.cc"
#if YYERROR_VERBOSE
/* Return YYSTR after stripping away unnecessary quotes and
backslashes, so that it's suitable for yyerror. The heuristic is
that double-quoting is unnecessary unless the string contains an
apostrophe, a comma, or backslash (other than backslash-backslash).
YYSTR is taken from yytname. */
std::string
rd_parser::yytnamerr_ (const char *yystr)
{
if (*yystr == '"')
{
std::string yyr = "";
char const *yyp = yystr;
for (;;)
switch (*++yyp)
{
case '\'':
case ',':
goto do_not_strip_quotes;
case '\\':
if (*++yyp != '\\')
goto do_not_strip_quotes;
/* Fall through. */
default:
yyr += *yyp;
break;
case '"':
return yyr;
}
do_not_strip_quotes: ;
}
return yystr;
}
#endif
/* Line 353 of lalr1.cc */
#line 161 "rd_parser/rd_parser.cc"
/// Build a parser object.
rd_parser::rd_parser (resolution_diagram &parsed_rd_yyarg)
@ -202,6 +185,9 @@ namespace yy {
{
YYUSE (yylocationp);
YYUSE (yyvaluep);
std::ostream& yyo = debug_stream ();
std::ostream& yyoutput = yyo;
YYUSE (yyoutput);
switch (yytype)
{
default:
@ -230,7 +216,8 @@ namespace yy {
YYUSE (yymsg);
YYUSE (yyvaluep);
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
if (yymsg)
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
@ -275,6 +262,18 @@ namespace yy {
}
#endif
inline bool
rd_parser::yy_pact_value_is_default_ (int yyvalue)
{
return yyvalue == yypact_ninf_;
}
inline bool
rd_parser::yy_table_value_is_error_ (int yyvalue)
{
return yyvalue == yytable_ninf_;
}
int
rd_parser::parse ()
{
@ -282,17 +281,18 @@ namespace yy {
int yychar = yyempty_;
int yytoken = 0;
/* State. */
// State.
int yyn;
int yylen = 0;
int yystate = 0;
/* Error handling. */
// Error handling.
int yynerrs_ = 0;
int yyerrstatus_ = 0;
/// Semantic value of the lookahead.
semantic_type yylval;
static semantic_type yyval_default;
semantic_type yylval = yyval_default;
/// Location of the lookahead.
location_type yylloc;
/// The locations where the error started and ended.
@ -305,6 +305,10 @@ namespace yy {
int yyresult;
// FIXME: This shoud be completely indented. It is not yet to
// avoid gratuitous conflicts when merging into the master branch.
try
{
YYCDEBUG << "Starting parse" << std::endl;
@ -334,17 +338,16 @@ namespace yy {
/* Try to take a decision without lookahead. */
yyn = yypact_[yystate];
if (yyn == yypact_ninf_)
if (yy_pact_value_is_default_ (yyn))
goto yydefault;
/* Read a lookahead token. */
if (yychar == yyempty_)
{
YYCDEBUG << "Reading a token: ";
yychar = yylex (&yylval);
YYCDEBUG << "Reading a token: ";
yychar = yylex (&yylval);
}
/* Convert token to internal form. */
if (yychar <= yyeof_)
{
@ -367,8 +370,8 @@ namespace yy {
yyn = yytable_[yyn];
if (yyn <= 0)
{
if (yyn == 0 || yyn == yytable_ninf_)
goto yyerrlab;
if (yy_table_value_is_error_ (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
@ -415,16 +418,18 @@ namespace yy {
else
yyval = yysemantic_stack_[0];
// Compute the default @$.
{
slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
YYLLOC_DEFAULT (yyloc, slice, yylen);
}
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
case 2:
/* Line 678 of lalr1.cc */
case 2:
/* Line 670 of lalr1.cc */
#line 54 "rd_parser/rd_parser.yy"
{
unsigned n_crossings = (yysemantic_stack_[(1) - (1)].integer);
@ -453,8 +458,7 @@ namespace yy {
break;
case 6:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 88 "rd_parser/rd_parser.yy"
{
unsigned s = ++ parsed_rd.n_starting_circles;
@ -480,8 +484,7 @@ namespace yy {
break;
case 12:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 126 "rd_parser/rd_parser.yy"
{
basedvector<int, 1> *v =
@ -492,8 +495,7 @@ namespace yy {
break;
case 13:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 133 "rd_parser/rd_parser.yy"
{
basedvector<int, 1> *v = (yysemantic_stack_[(3) - (1)].cpt_vec);
@ -503,36 +505,31 @@ namespace yy {
break;
case 15:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 143 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = (yysemantic_stack_[(2) - (1)].cpt) | CPT_MARKED; }
break;
case 16:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 145 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = (yysemantic_stack_[(2) - (1)].cpt) | CPT_MARKED2; }
break;
case 17:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 147 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = (yysemantic_stack_[(3) - (1)].cpt) | CPT_MARKED | CPT_MARKED2; }
break;
case 18:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 149 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = (yysemantic_stack_[(3) - (1)].cpt) | CPT_MARKED | CPT_MARKED2; }
break;
case 19:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 154 "rd_parser/rd_parser.yy"
{
if ((yysemantic_stack_[(2) - (2)].inside))
@ -542,26 +539,35 @@ namespace yy {
break;
case 20:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 163 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = parsed_rd.crossing_to_cpt ((yysemantic_stack_[(2) - (2)].integer)); }
break;
case 21:
/* Line 678 of lalr1.cc */
/* Line 670 of lalr1.cc */
#line 165 "rd_parser/rd_parser.yy"
{ (yyval.cpt) = parsed_rd.crossing_from_cpt ((yysemantic_stack_[(2) - (2)].integer)); }
break;
/* Line 678 of lalr1.cc */
#line 562 "rd_parser/rd_parser.cc"
default:
break;
/* Line 670 of lalr1.cc */
#line 556 "rd_parser/rd_parser.cc"
default:
break;
}
/* User semantic actions sometimes alter yychar, and that requires
that yytoken be updated with the new translation. We take the
approach of translating immediately before every use of yytoken.
One alternative is translating here after every semantic action,
but that translation would be missed if the semantic action
invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
yychar. In the case of YYABORT or YYACCEPT, an incorrect
destructor might then be invoked immediately. In the case of
YYERROR, subsequent parser actions might lead to an incorrect
destructor call or verbose syntax error message before the
lookahead is translated. */
YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
yypop_ (yylen);
@ -585,30 +591,35 @@ namespace yy {
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
yytoken = yytranslate_ (yychar);
/* If not already recovering from an error, report this error. */
if (!yyerrstatus_)
{
++yynerrs_;
error (yylloc, yysyntax_error_ (yystate));
if (yychar == yyempty_)
yytoken = yyempty_;
error (yylloc, yysyntax_error_ (yystate, yytoken));
}
yyerror_range[1] = yylloc;
if (yyerrstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= yyeof_)
{
/* Return failure if at end of input. */
if (yychar == yyeof_)
YYABORT;
}
else
{
yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
yychar = yyempty_;
}
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= yyeof_)
{
/* Return failure if at end of input. */
if (yychar == yyeof_)
YYABORT;
}
else
{
yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
yychar = yyempty_;
}
}
/* Else will try to reuse lookahead token after shifting the error
@ -644,7 +655,7 @@ namespace yy {
for (;;)
{
yyn = yypact_[yystate];
if (yyn != yypact_ninf_)
if (!yy_pact_value_is_default_ (yyn))
{
yyn += yyterror_;
if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
@ -657,7 +668,7 @@ namespace yy {
/* Pop the current state because it cannot handle the error token. */
if (yystate_stack_.height () == 1)
YYABORT;
YYABORT;
yyerror_range[1] = yylocation_stack_[0];
yydestruct_ ("Error: popping",
@ -694,70 +705,60 @@ namespace yy {
yyreturn:
if (yychar != yyempty_)
yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
{
/* Make sure we have latest lookahead translation. See comments
at user semantic actions for why this is necessary. */
yytoken = yytranslate_ (yychar);
yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval,
&yylloc);
}
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
yypop_ (yylen);
while (yystate_stack_.height () != 1)
while (1 < yystate_stack_.height ())
{
yydestruct_ ("Cleanup: popping",
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
yydestruct_ ("Cleanup: popping",
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
}
return yyresult;
}
catch (...)
{
YYCDEBUG << "Exception caught: cleaning lookahead and stack"
<< std::endl;
// Do not try to display the values of the reclaimed symbols,
// as their printer might throw an exception.
if (yychar != yyempty_)
{
/* Make sure we have latest lookahead translation. See
comments at user semantic actions for why this is
necessary. */
yytoken = yytranslate_ (yychar);
yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc);
}
while (1 < yystate_stack_.height ())
{
yydestruct_ (YY_NULL,
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
}
throw;
}
}
// Generate an error message.
std::string
rd_parser::yysyntax_error_ (int yystate)
rd_parser::yysyntax_error_ (int, int)
{
std::string res;
YYUSE (yystate);
#if YYERROR_VERBOSE
int yyn = yypact_[yystate];
if (yypact_ninf_ < yyn && yyn <= yylast_)
{
/* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
int yychecklim = yylast_ - yyn + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
int count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
++count;
// FIXME: This method of building the message is not compatible
// with internationalization. It should work like yacc.c does it.
// That is, first build a string that looks like this:
// "syntax error, unexpected %s or %s or %s"
// Then, invoke YY_ on this string.
// Finally, use the string as a format to output
// yytname_[tok], etc.
// Until this gets fixed, this message appears in English only.
res = "syntax error, unexpected ";
res += yytnamerr_ (yytname_[tok]);
if (count < 5)
{
count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
{
res += (!count++) ? ", expecting " : " or ";
res += yytnamerr_ (yytname_[x]);
}
}
}
else
#endif
res = YY_("syntax error");
return res;
return YY_("syntax error");
}
@ -773,9 +774,9 @@ namespace yy {
-12, -12, -12, 18, 13, -12, -12
};
/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
doesn't specify something else to do. Zero means the default is an
error. */
/* YYDEFACT[S] -- default reduction number in state S. Performed when
YYTABLE doesn't specify something else to do. Zero means the
default is an error. */
const unsigned char
rd_parser::yydefact_[] =
{
@ -803,7 +804,7 @@ namespace yy {
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says. */
number is the opposite. If YYTABLE_NINF_, syntax error. */
const signed char rd_parser::yytable_ninf_ = -1;
const unsigned char
rd_parser::yytable_[] =
@ -864,7 +865,7 @@ namespace yy {
2, 2, 1, 1
};
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
#if YYDEBUG
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at \a yyntokens_, nonterminals. */
const char*
@ -875,11 +876,10 @@ namespace yy {
"resolution_diagram", "$@1", "starting_circles", "starting_circle",
"dual_crossings_opt", "dual_crossings", "dual_crossing",
"crossing_points", "crossing_point", "crossing_point_1",
"crossing_point_spec", "inout", 0
"crossing_point_spec", "inout", YY_NULL
};
#endif
#if YYDEBUG
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
const rd_parser::rhs_number_type
rd_parser::yyrhs_[] =
@ -997,12 +997,9 @@ namespace yy {
} // yy
/* Line 1054 of lalr1.cc */
#line 1003 "rd_parser/rd_parser.cc"
/* Line 1056 of lalr1.cc */
/* Line 1141 of lalr1.cc */
#line 1002 "rd_parser/rd_parser.cc"
/* Line 1142 of lalr1.cc */
#line 173 "rd_parser/rd_parser.yy"
@ -1027,4 +1024,3 @@ parse_resolution_diagram (const char *s)
return rd;
}

View File

@ -1,9 +1,8 @@
/* A Bison parser, made by GNU Bison 2.4.3. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Skeleton interface for Bison LALR(1) parsers in C++
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
Software Foundation, Inc.
Copyright (C) 2002-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -31,41 +30,30 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/**
** \file rd_parser/rd_parser.hh
** Define the yy::parser class.
*/
/* C++ LALR(1) parser skeleton written by Akim Demaille. */
#ifndef PARSER_HEADER_H
# define PARSER_HEADER_H
#ifndef YY_YY_RD_PARSER_RD_PARSER_HH_INCLUDED
# define YY_YY_RD_PARSER_RD_PARSER_HH_INCLUDED
/* "%code requires" blocks. */
/* Line 35 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 11 "rd_parser/rd_parser.yy"
#include <knotkit.h>
/* Line 35 of lalr1.cc */
#line 50 "rd_parser/rd_parser.hh"
/* Line 33 of lalr1.cc */
#line 52 "rd_parser/rd_parser.hh"
#include <string>
#include <iostream>
#include "stack.hh"
namespace yy {
/* Line 35 of lalr1.cc */
#line 61 "rd_parser/rd_parser.hh"
class position;
class location;
} // yy
/* Line 35 of lalr1.cc */
#line 68 "rd_parser/rd_parser.hh"
#include "location.hh"
/* Enabling traces. */
@ -73,43 +61,10 @@ namespace yy {
# define YYDEBUG 0
#endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE 0
#endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE 0
#endif
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do { \
if (N) \
{ \
(Current).begin = (Rhs)[1].begin; \
(Current).end = (Rhs)[N].end; \
} \
else \
{ \
(Current).begin = (Current).end = (Rhs)[0].end; \
} \
} while (false)
#endif
namespace yy {
/* Line 35 of lalr1.cc */
#line 113 "rd_parser/rd_parser.hh"
/* Line 33 of lalr1.cc */
#line 68 "rd_parser/rd_parser.hh"
/// A Bison parser.
class rd_parser
@ -119,8 +74,7 @@ namespace yy {
#ifndef YYSTYPE
union semantic_type
{
/* Line 35 of lalr1.cc */
/* Line 33 of lalr1.cc */
#line 25 "rd_parser/rd_parser.yy"
int integer;
@ -129,9 +83,8 @@ namespace yy {
basedvector<int, 1> *cpt_vec;
/* Line 35 of lalr1.cc */
#line 135 "rd_parser/rd_parser.hh"
/* Line 33 of lalr1.cc */
#line 88 "rd_parser/rd_parser.hh"
};
#else
typedef YYSTYPE semantic_type;
@ -186,7 +139,7 @@ namespace yy {
/// Generate an error message.
/// \param state the state where the error occurred.
/// \param tok the lookahead token.
virtual std::string yysyntax_error_ (int yystate);
virtual std::string yysyntax_error_ (int yystate, int tok);
#if YYDEBUG
/// \brief Report a symbol value on the debug stream.
@ -222,6 +175,14 @@ namespace yy {
/// The location stack.
location_stack_type yylocation_stack_;
/// Whether the given \c yypact_ value indicates a defaulted state.
/// \param yyvalue the value to check
static bool yy_pact_value_is_default_ (int yyvalue);
/// Whether the given \c yytable_ value indicates a syntax error.
/// \param yyvalue the value to check
static bool yy_table_value_is_error_ (int yyvalue);
/// Internal symbol numbers.
typedef unsigned char token_number_type;
/* Tables. */
@ -229,7 +190,7 @@ namespace yy {
static const signed char yypact_[];
static const signed char yypact_ninf_;
/// For a state, default rule to reduce.
/// For a state, default reduction number.
/// Unless\a yytable_ specifies something else to do.
/// Zero means the default is an error.
static const unsigned char yydefact_[];
@ -253,19 +214,12 @@ namespace yy {
/// For a rule, its LHS.
static const unsigned char yyr1_[];
/// For a rule, its RHS length.
static const unsigned char yyr2_[];
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/// For a symbol, its name in clear.
static const char* const yytname_[];
#endif
#if YYERROR_VERBOSE
/// Convert the symbol name \a n to a form suitable for a diagnostic.
virtual std::string yytnamerr_ (const char *n);
#endif
static const unsigned char yyr2_[];
#if YYDEBUG
/// For a symbol, its name in clear.
static const char* const yytname_[];
/// A type to store symbol numbers and -1.
typedef signed char rhs_number_type;
/// A `-1'-separated list of the rules' RHS.
@ -291,6 +245,7 @@ namespace yy {
/// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed.
/// If null, do not display the symbol, just free it.
/// \param yytype The symbol type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
@ -320,10 +275,9 @@ namespace yy {
};
} // yy
/* Line 35 of lalr1.cc */
#line 326 "rd_parser/rd_parser.hh"
/* Line 33 of lalr1.cc */
#line 280 "rd_parser/rd_parser.hh"
#endif /* ! defined PARSER_HEADER_H */
#endif /* !YY_YY_RD_PARSER_RD_PARSER_HH_INCLUDED */

View File

@ -1,9 +1,8 @@
/* A Bison parser, made by GNU Bison 2.4.3. */
/* A Bison parser, made by GNU Bison 2.7. */
/* Stack handling for Bison parsers in C++
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
Software Foundation, Inc.
Copyright (C) 2002-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -31,21 +30,24 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
#ifndef BISON_STACK_HH
# define BISON_STACK_HH
/**
** \file rd_parser/stack.hh
** Define the yy::stack class.
*/
#include <deque>
#ifndef YY_YY_RD_PARSER_STACK_HH_INCLUDED
# define YY_YY_RD_PARSER_STACK_HH_INCLUDED
# include <deque>
namespace yy {
/* Line 1067 of lalr1.cc */
#line 44 "rd_parser/stack.hh"
/* Line 34 of stack.hh */
#line 47 "rd_parser/stack.hh"
template <class T, class S = std::deque<T> >
class stack
{
public:
// Hide our reversed order.
typedef typename S::reverse_iterator iterator;
typedef typename S::const_reverse_iterator const_iterator;
@ -84,7 +86,7 @@ namespace yy {
pop (unsigned int n = 1)
{
for (; n; --n)
seq_.pop_front ();
seq_.pop_front ();
}
inline
@ -98,7 +100,6 @@ namespace yy {
inline const_iterator end () const { return seq_.rend (); }
private:
S seq_;
};
@ -107,10 +108,9 @@ namespace yy {
class slice
{
public:
slice (const S& stack,
unsigned int range) : stack_ (stack),
range_ (range)
slice (const S& stack, unsigned int range)
: stack_ (stack)
, range_ (range)
{
}
@ -122,15 +122,12 @@ namespace yy {
}
private:
const S& stack_;
unsigned int range_;
};
} // yy
/* Line 116 of stack.hh */
#line 132 "rd_parser/stack.hh"
/* Line 1153 of lalr1.cc */
#line 134 "rd_parser/stack.hh"
#endif // not BISON_STACK_HH[]dnl
#endif /* !YY_YY_RD_PARSER_STACK_HH_INCLUDED */