simple.cc - generated code example
[prop.git] / include / AD / automata / follow.h
bloba57862de4c9e56f142f3d0e713b9bc38c9a2cfce
1 //////////////////////////////////////////////////////////////////////////////
2 // NOTICE:
3 //
4 // ADLib, Prop and their related set of tools and documentation are in the
5 // public domain. The author(s) of this software reserve no copyrights on
6 // the source code and any code generated using the tools. You are encouraged
7 // to use ADLib and Prop to develop software, in both academic and commercial
8 // settings, and are free to incorporate any part of ADLib and Prop into
9 // your programs.
11 // Although you are under no obligation to do so, we strongly recommend that
12 // you give away all software developed using our tools.
14 // We also ask that credit be given to us when ADLib and/or Prop are used in
15 // your programs, and that this notice be preserved intact in all the source
16 // code.
18 // This software is still under development and we welcome any suggestions
19 // and help from the users.
21 // Allen Leung
22 // 1994
23 //////////////////////////////////////////////////////////////////////////////
25 #ifndef follow_set_computation_h
26 #define follow_set_computation_h
28 #include <AD/automata/firstset.h>
29 #include <AD/contain/bitset.h>
30 #include <AD/memory/mempool.h>
32 //////////////////////////////////////////////////////////////////////////////
33 // This class computes the follow sets of a grammar.
34 // follow(A) = { c | such that c can immediately follow A in a derivation }
35 // Implicitly, we need to know compute first(X). We'll inherit
36 // from class FirstSet.
37 //////////////////////////////////////////////////////////////////////////////
38 class FollowSet : public FirstSet {
40 FollowSet(const FollowSet&); // no copy constructor
41 void operator = (const FollowSet&); // no assignment
43 public:
45 ///////////////////////////////////////////////////////////////////////////
46 // Import some types
47 ///////////////////////////////////////////////////////////////////////////
48 typedef FirstSet Super;
49 typedef Super::Symbol Symbol;
50 typedef Super::Terminal Terminal;
51 typedef Super::NonTerminal NonTerminal;
52 typedef Super::Production Production;
53 typedef Super::ProductionList ProductionList;
55 protected:
57 ///////////////////////////////////////////////////////////////////////////
58 // Internals
59 ///////////////////////////////////////////////////////////////////////////
60 BitSet ** follow_set; // an array of terminals set indexed by non-terminal
62 public:
64 ///////////////////////////////////////////////////////////////////////////
65 // Constructor and destructor
66 ///////////////////////////////////////////////////////////////////////////
67 FollowSet(const Grammar&, Mem&);
68 ~FollowSet();
70 ///////////////////////////////////////////////////////////////////////////
71 // Follow set computation
72 ///////////////////////////////////////////////////////////////////////////
73 inline const BitSet& follow (NonTerminal A) const { return *follow_set[A]; }
76 #endif