Ejemplo n.º 1
0
    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!
    }
Ejemplo n.º 2
0
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;
}