summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2021-09-12 12:50:04 +0200
committerAkim Demaille <akim.demaille@gmail.com>2021-09-12 14:00:55 +0200
commit10ee04479f55962be2bafddca07eef8faf8cc8bf (patch)
tree1da4c0e0fd0d7739592f33edd994930f187c1504
parentc09524cf8f25562dcff543b6ef7c2c5d368a7a2e (diff)
downloadbison-10ee04479f55962be2bafddca07eef8faf8cc8bf.tar.gz
glr2.cc: put glr_state_set and glr_stack_item in unnamed namespace
* data/skeletons/glr2.cc: here.
-rw-r--r--data/skeletons/glr2.cc487
1 files changed, 248 insertions, 239 deletions
diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc
index dcb00943..17dde98e 100644
--- a/data/skeletons/glr2.cc
+++ b/data/skeletons/glr2.cc
@@ -776,12 +776,15 @@ typedef int state_num;
/** Rule numbers, as in LALR(1) machine */
typedef int rule_num;
-// Forward declarations.
namespace
{
+ using parser_type = ]b4_namespace_ref[::]b4_parser_class[;
+ using glr_state = parser_type::glr_state;
+
+ // Forward declarations.
+ class glr_stack_item;
class semantic_option;
}
-class glr_stack_item;
/** Accessing symbol of state YYSTATE. */
static inline yysymbol_kind_t
@@ -954,7 +957,7 @@ namespace ]b4_namespace_ref[
}
#endif
- std::ptrdiff_t indexIn (const glr_stack_item* array) const;
+ std::ptrdiff_t indexIn (const glr_stack_item* array) const YY_ATTRIBUTE_UNUSED;
glr_stack_item* asItem ()
{]b4_parse_assert_if([[
@@ -1015,146 +1018,149 @@ namespace ]b4_namespace_ref[
// A magic number to check our pointer arithmetic is sane.
enum { MAGIC = 713705 };
unsigned int magic_;]])[
- };
+ }; // class ]b4_parser_class[::glr_state
} // namespace ]b4_namespace_ref[
-/** A stack of GLRState representing the different heads during
- * nondeterministic evaluation. */
-class glr_state_set
+namespace
{
-public:
- /** Initialize YYSET to a singleton set containing an empty stack. */
- glr_state_set ()
- : yylastDeleted (YY_NULLPTR)
+ /** A stack of GLRState representing the different heads during
+ * nondeterministic evaluation. */
+ class glr_state_set
{
- yystates.push_back (YY_NULLPTR);
- yylookaheadNeeds.push_back (false);
- }
+ public:
+ /** Initialize YYSET to a singleton set containing an empty stack. */
+ glr_state_set ()
+ : yylastDeleted (YY_NULLPTR)
+ {
+ yystates.push_back (YY_NULLPTR);
+ yylookaheadNeeds.push_back (false);
+ }
- // Behave like a vector of states.
- glr_state*& operator[] (state_set_index index)
- {
- return yystates[index.uget()];
- }
+ // Behave like a vector of states.
+ glr_state*& operator[] (state_set_index index)
+ {
+ return yystates[index.uget()];
+ }
- glr_state* operator[] (state_set_index index) const
- {
- return yystates[index.uget()];
- }
+ glr_state* operator[] (state_set_index index) const
+ {
+ return yystates[index.uget()];
+ }
- size_t size () const
- {
- return yystates.size ();
- }
+ size_t size () const
+ {
+ return yystates.size ();
+ }
- std::vector<glr_state*>::iterator begin ()
- {
- return yystates.begin ();
- }
+ std::vector<glr_state*>::iterator begin ()
+ {
+ return yystates.begin ();
+ }
- std::vector<glr_state*>::iterator end ()
- {
- return yystates.end ();
- }
+ std::vector<glr_state*>::iterator end ()
+ {
+ return yystates.end ();
+ }
- bool lookaheadNeeds (state_set_index index) const
- {
- return yylookaheadNeeds[index.uget ()];
- }
+ bool lookaheadNeeds (state_set_index index) const
+ {
+ return yylookaheadNeeds[index.uget ()];
+ }
- bool setLookaheadNeeds (state_set_index index, bool value)
- {
- return yylookaheadNeeds[index.uget ()] = value;
- }
+ bool setLookaheadNeeds (state_set_index index, bool value)
+ {
+ return yylookaheadNeeds[index.uget ()] = value;
+ }
- /** Invalidate stack #YYK. */
- void
- yymarkStackDeleted (state_set_index yyk)
- {
- size_t k = yyk.uget ();
- if (yystates[k] != YY_NULLPTR)
- yylastDeleted = yystates[k];
- yystates[k] = YY_NULLPTR;
- }
+ /** Invalidate stack #YYK. */
+ void
+ yymarkStackDeleted (state_set_index yyk)
+ {
+ size_t k = yyk.uget ();
+ if (yystates[k] != YY_NULLPTR)
+ yylastDeleted = yystates[k];
+ yystates[k] = YY_NULLPTR;
+ }
- /** Undelete the last stack in *this that was marked as deleted. Can
- only be done once after a deletion, and only when all other stacks have
- been deleted. */
- void
- yyundeleteLastStack ()
- {
- if (yylastDeleted == YY_NULLPTR || !yystates.empty ())
- return;
- yystates.push_back (yylastDeleted);
- YYCDEBUG << "Restoring last deleted stack as stack #0.\n";
- clearLastDeleted ();
- }
+ /** Undelete the last stack in *this that was marked as deleted. Can
+ only be done once after a deletion, and only when all other stacks have
+ been deleted. */
+ void
+ yyundeleteLastStack ()
+ {
+ if (yylastDeleted == YY_NULLPTR || !yystates.empty ())
+ return;
+ yystates.push_back (yylastDeleted);
+ YYCDEBUG << "Restoring last deleted stack as stack #0.\n";
+ clearLastDeleted ();
+ }
- /** Remove the dead stacks (yystates[i] == YY_NULLPTR) and shift the later
- * ones. */
- void
- yyremoveDeletes ()
- {
- size_t newsize = yystates.size ();
- /* j is the number of live stacks we have seen. */
- for (size_t i = 0, j = 0; j < newsize; ++i)
- {
- if (yystates[i] == YY_NULLPTR)
- {
- if (i == j)
- {
- YYCDEBUG << "Removing dead stacks.\n";
- }
- newsize -= 1;
- }
- else
- {
- yystates[j] = yystates[i];
- /* In the current implementation, it's unnecessary to copy
- yylookaheadNeeds[i] since, after
- yyremoveDeletes returns, the parser immediately either enters
- deterministic operation or shifts a token. However, it doesn't
- hurt, and the code might evolve to need it. */
- yylookaheadNeeds[j] = yylookaheadNeeds[i];
- if (j != i)
- {
- YYCDEBUG << "Rename stack " << i << " -> " << j << ".\n";
- }
- j += 1;
- }
- }
- yystates.resize (newsize);
- yylookaheadNeeds.resize (newsize);
- }
+ /** Remove the dead stacks (yystates[i] == YY_NULLPTR) and shift the later
+ * ones. */
+ void
+ yyremoveDeletes ()
+ {
+ size_t newsize = yystates.size ();
+ /* j is the number of live stacks we have seen. */
+ for (size_t i = 0, j = 0; j < newsize; ++i)
+ {
+ if (yystates[i] == YY_NULLPTR)
+ {
+ if (i == j)
+ {
+ YYCDEBUG << "Removing dead stacks.\n";
+ }
+ newsize -= 1;
+ }
+ else
+ {
+ yystates[j] = yystates[i];
+ /* In the current implementation, it's unnecessary to copy
+ yylookaheadNeeds[i] since, after
+ yyremoveDeletes returns, the parser immediately either enters
+ deterministic operation or shifts a token. However, it doesn't
+ hurt, and the code might evolve to need it. */
+ yylookaheadNeeds[j] = yylookaheadNeeds[i];
+ if (j != i)
+ {
+ YYCDEBUG << "Rename stack " << i << " -> " << j << ".\n";
+ }
+ j += 1;
+ }
+ }
+ yystates.resize (newsize);
+ yylookaheadNeeds.resize (newsize);
+ }
- state_set_index
- yysplitStack (state_set_index yyk)
- {
- const size_t k = yyk.uget ();
- yystates.push_back (yystates[k]);
- yylookaheadNeeds.push_back (yylookaheadNeeds[k]);
- return create_state_set_index (static_cast<std::ptrdiff_t> (yystates.size () - 1));
- }
+ state_set_index
+ yysplitStack (state_set_index yyk)
+ {
+ const size_t k = yyk.uget ();
+ yystates.push_back (yystates[k]);
+ yylookaheadNeeds.push_back (yylookaheadNeeds[k]);
+ return create_state_set_index (static_cast<std::ptrdiff_t> (yystates.size () - 1));
+ }
- void clearLastDeleted ()
- {
- yylastDeleted = YY_NULLPTR;
- }
+ void clearLastDeleted ()
+ {
+ yylastDeleted = YY_NULLPTR;
+ }
-private:
+ private:
- std::vector<glr_state*> yystates;
- /** During nondeterministic operation, yylookaheadNeeds tracks which
- * stacks have actually needed the current lookahead. During deterministic
- * operation, yylookaheadNeeds[0] is not maintained since it would merely
- * duplicate !yyla.empty (). */
- std::vector<bool> yylookaheadNeeds;
+ std::vector<glr_state*> yystates;
+ /** During nondeterministic operation, yylookaheadNeeds tracks which
+ * stacks have actually needed the current lookahead. During deterministic
+ * operation, yylookaheadNeeds[0] is not maintained since it would merely
+ * duplicate !yyla.empty (). */
+ std::vector<bool> yylookaheadNeeds;
- /** The last stack we invalidated. */
- glr_state* yylastDeleted;
-};
+ /** The last stack we invalidated. */
+ glr_state* yylastDeleted;
+ }; // class glr_state_set
+} // namespace
namespace
{
@@ -1411,135 +1417,138 @@ namespace
// A magic number to check our pointer arithmetic is sane.
enum { MAGIC = 0xeff1cace };
unsigned int magic_;]])[
- };
-}
+ }; // class semantic_option
+} // namespace
-/** Type of the items in the GLR stack.
- * It can be either a glr_state or a semantic_option. The is_state_ field
- * indicates which item of the union is valid. */
-class glr_stack_item
+namespace
{
-public:
- glr_stack_item (bool state = true)
- : is_state_ (state)]b4_parse_assert_if([[
- , magic_ (MAGIC)]])[
+ /** Type of the items in the GLR stack.
+ * It can be either a glr_state or a semantic_option. The is_state_ field
+ * indicates which item of the union is valid. */
+ class glr_stack_item
{
- if (is_state_)
- new (&raw_) glr_state;
- else
- new (&raw_) semantic_option;
- }
+ public:
+ glr_stack_item (bool state = true)
+ : is_state_ (state)]b4_parse_assert_if([[
+ , magic_ (MAGIC)]])[
+ {
+ if (is_state_)
+ new (&raw_) glr_state;
+ else
+ new (&raw_) semantic_option;
+ }
- glr_stack_item (const glr_stack_item& other) YY_NOEXCEPT YY_NOTHROW
- : is_state_ (other.is_state_)]b4_parse_assert_if([[
- , magic_ (MAGIC)]])[
- {]b4_parse_assert_if([[
- other.check_ ();]])[
- std::memcpy (raw_, other.raw_, union_size);
- }
+ glr_stack_item (const glr_stack_item& other) YY_NOEXCEPT YY_NOTHROW
+ : is_state_ (other.is_state_)]b4_parse_assert_if([[
+ , magic_ (MAGIC)]])[
+ {]b4_parse_assert_if([[
+ other.check_ ();]])[
+ std::memcpy (raw_, other.raw_, union_size);
+ }
- glr_stack_item& operator= (glr_stack_item other)
- {]b4_parse_assert_if([[
- check_ ();
- other.check_ ();]])[
- std::swap (is_state_, other.is_state_);
- std::swap (raw_, other.raw_);
- return *this;
- }
+ glr_stack_item& operator= (glr_stack_item other)
+ {]b4_parse_assert_if([[
+ check_ ();
+ other.check_ ();]])[
+ std::swap (is_state_, other.is_state_);
+ std::swap (raw_, other.raw_);
+ return *this;
+ }
- ~glr_stack_item ()
- {]b4_parse_assert_if([[
- check_ ();]])[
- if (is_state ())
- getState ().~glr_state ();
- else
- getOption ().~semantic_option ();
- }
+ ~glr_stack_item ()
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ if (is_state ())
+ getState ().~glr_state ();
+ else
+ getOption ().~semantic_option ();
+ }
- void setState (const glr_state &state)
- {]b4_parse_assert_if([[
- check_ ();
- state.check_ ();]])[
- if (this != state.asItem ())
- {
- if (is_state_)
- getState ().~glr_state ();
- else
- getOption ().~semantic_option ();
- new (&raw_) glr_state (state);
- is_state_ = true;
- }
- }
+ void setState (const glr_state &state)
+ {]b4_parse_assert_if([[
+ check_ ();
+ state.check_ ();]])[
+ if (this != state.asItem ())
+ {
+ if (is_state_)
+ getState ().~glr_state ();
+ else
+ getOption ().~semantic_option ();
+ new (&raw_) glr_state (state);
+ is_state_ = true;
+ }
+ }
- glr_state& getState ()
- {]b4_parse_assert_if([[
- check_ ();]])[
- YYDASSERT (is_state ());
- void *yyp = raw_;
- glr_state& res = *static_cast<glr_state*> (yyp);]b4_parse_assert_if([[
- res.check_ ();]])[
- return res;
- }
+ glr_state& getState ()
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ YYDASSERT (is_state ());
+ void *yyp = raw_;
+ glr_state& res = *static_cast<glr_state*> (yyp);]b4_parse_assert_if([[
+ res.check_ ();]])[
+ return res;
+ }
- const glr_state& getState () const
- {]b4_parse_assert_if([[
- check_ ();]])[
- YYDASSERT (is_state ());
- const void *yyp = raw_;
- const glr_state& res = *static_cast<const glr_state*> (yyp);]b4_parse_assert_if([[
- res.check_ ();]])[
- return res;
- }
+ const glr_state& getState () const
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ YYDASSERT (is_state ());
+ const void *yyp = raw_;
+ const glr_state& res = *static_cast<const glr_state*> (yyp);]b4_parse_assert_if([[
+ res.check_ ();]])[
+ return res;
+ }
- semantic_option& getOption ()
- {]b4_parse_assert_if([[
- check_ ();]])[
- YYDASSERT (!is_state ());
- void *yyp = raw_;
- return *static_cast<semantic_option*> (yyp);
- }
- const semantic_option& getOption () const
- {]b4_parse_assert_if([[
- check_ ();]])[
- YYDASSERT (!is_state ());
- const void *yyp = raw_;
- return *static_cast<const semantic_option*> (yyp);
- }
- bool is_state () const
- {]b4_parse_assert_if([[
- check_ ();]])[
- return is_state_;
- }
+ semantic_option& getOption ()
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ YYDASSERT (!is_state ());
+ void *yyp = raw_;
+ return *static_cast<semantic_option*> (yyp);
+ }
+ const semantic_option& getOption () const
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ YYDASSERT (!is_state ());
+ const void *yyp = raw_;
+ return *static_cast<const semantic_option*> (yyp);
+ }
+ bool is_state () const
+ {]b4_parse_assert_if([[
+ check_ ();]])[
+ return is_state_;
+ }
-private:
- /// The possible contents of raw_. Since they have constructors, they cannot
- /// be directly included in the union.
- union contents
- {
- char yystate[sizeof (glr_state)];
- char yyoption[sizeof (semantic_option)];
- };
- enum { union_size = sizeof (contents) };
- union {
- /// Strongest alignment constraints.
- long double yyalign_me;
- /// A buffer large enough to store the contents.
- char raw_[union_size];
- };
- /** Type tag for the union. */
- bool is_state_;
+ private:
+ /// The possible contents of raw_. Since they have constructors, they cannot
+ /// be directly included in the union.
+ union contents
+ {
+ char yystate[sizeof (glr_state)];
+ char yyoption[sizeof (semantic_option)];
+ };
+ enum { union_size = sizeof (contents) };
+ union {
+ /// Strongest alignment constraints.
+ long double yyalign_me;
+ /// A buffer large enough to store the contents.
+ char raw_[union_size];
+ };
+ /** Type tag for the union. */
+ bool is_state_;
]b4_parse_assert_if([[
-public:
- // Check invariants.
- void check_ () const
- {
- YYASSERT (this->magic_ == MAGIC);
- YYASSERT (this->is_state_ == false || this->is_state_ == true);
- }
- // A magic number to check our pointer arithmetic is sane.
- enum { MAGIC = 0xDEAD1ACC }; // 3735886540.
- const unsigned int magic_;]])[
-};
+ public:
+ // Check invariants.
+ void check_ () const
+ {
+ YYASSERT (this->magic_ == MAGIC);
+ YYASSERT (this->is_state_ == false || this->is_state_ == true);
+ }
+ // A magic number to check our pointer arithmetic is sane.
+ enum { MAGIC = 0xDEAD1ACC }; // 3735886540.
+ const unsigned int magic_;]])[
+ }; // class glr_stack_item
+} // namespace
glr_state* glr_state::pred ()
{]b4_parse_assert_if([[