void Grammar::Canonicalize() { CEMapType CanonExpansions; auto it = NonTerminalMap.find(StartNTName); if (it == NonTerminalMap.end()) { throw GrammarException((string)"Error: Attempted to canonicalize grammar \"" + Name + "\"" + " without having defined a start non-terminal"); } InstantiateDFS(it->second, set<string>(), CanonExpansions); // Now, we need to unroll the canonical nonterminals UnrollCanonExpansions(CanonExpansions); // DONE! Whew! }
std::string SemState::define_var(Variable::VarType type, const std::string& name, int line) { // 检查符号名是否被重定义 std::vector<RoughSymbol>& scoped_symbols = current_scope()->scoped_symbols; for (size_t i = 0, sz = scoped_symbols.size(); i < sz; ++i) { const RoughSymbol& sym = scoped_symbols.at(i); if (sym.name == name) throw GrammarException("Symbol '" + name + "' redefined", line); } // 注册符号表 RoughSymbol sym(type, name); for (ssize_t i = _scope_stack.size() - 1; i >= 0; --i) { ScopeState *ss = _scope_stack.at(i); assert(NULL != ss); switch (ss->type) { case ScopeState::TYPE_ANNOYMOUS_SCOPE: continue; case ScopeState::TYPE_PROC_SCOPE: case ScopeState::TYPE_MODULE_SCOPE: { ProcScopeState *pss = (ProcScopeState*) ss; assert(NULL != pss); sym.uniq_name = pss->mk_uniq_name(name); scoped_symbols.push_back(sym); pss->proc_symbols.push_back(sym); return sym.uniq_name; } default: assert(false); break; } } assert(false); return sym.uniq_name; }