Example #1
0
 /// <summary>
 /// Adiciona uma tabela de ação.
 /// </summary>
 /// <param name="index"></param>
 /// <param name="table"></param>
 private void AddLalrTable(int index, LRActionTable table)
 {
     if (!_initialized)
     {
         throw new ParserException("Table counts not initialized");
     }
     _LalrTables[index] = table;
 }
Example #2
0
        /// <summary>
        /// Executa parser para o token.
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        private ParseResult ParseToken(Token token)
        {
            ParseResult   result = ParseResult.InternalError;
            LRActionTable table  = _LalrTables[_LalrState];
            LRAction      action = table.GetActionForSymbol(token.TableIndex);

            if (action != null)
            {
                _haveReduction = false;
                _outputTokens.Clear();
                switch (action.Action)
                {
                case Action.Accept:
                    _haveReduction = true;
                    result         = ParseResult.Accept;
                    break;

                case Action.Shift:
                    token.State = _LalrState = action.Value;
                    _tempStack.PushToken(token);
                    result = ParseResult.Shift;
                    break;

                case Action.Reduce:
                    result = Reduce(_rules[action.Value]);
                    break;
                }
            }
            else
            {
                _outputTokens.Clear();
                foreach (LRAction a in table.Members)
                {
                    SymbolType kind = a.Symbol.Kind;
                    if (kind == SymbolType.Terminal || kind == SymbolType.End)
                    {
                        _outputTokens.PushToken(new Token(a.Symbol));
                    }
                }
                result = ParseResult.SyntaxError;
            }
            return(result);
        }
Example #3
0
        /// <summary>
        /// Carrega as tabelas da gramática.
        /// </summary>
        /// <param name="reader"></param>
        private void LoadTables(GrammarReader reader)
        {
            object obj;
            int    index;

            while (reader.MoveNext())
            {
                byte id = (byte)reader.RetrieveNext();
                switch ((RecordId)id)
                {
                case RecordId.Parameters:
                    _parameters["Name"]    = (string)reader.RetrieveNext();
                    _parameters["Version"] = (string)reader.RetrieveNext();
                    _parameters["Author"]  = (string)reader.RetrieveNext();
                    _parameters["About"]   = (string)reader.RetrieveNext();
                    _caseSensitive         = (bool)reader.RetrieveNext();
                    _startSymbol           = (int)reader.RetrieveNext();
                    break;

                case RecordId.TableCounts:
                    _symbols     = new Symbol[(int)reader.RetrieveNext()];
                    _charsets    = new String[(int)reader.RetrieveNext()];
                    _rules       = new Rule[(int)reader.RetrieveNext()];
                    _DfaStates   = new FAState[(int)reader.RetrieveNext()];
                    _LalrTables  = new LRActionTable[(int)reader.RetrieveNext()];
                    _initialized = true;
                    break;

                case RecordId.Initial:
                    _initDfaState  = (int)reader.RetrieveNext();
                    _initLalrState = (int)reader.RetrieveNext();
                    break;

                case RecordId.Symbols:
                    index = (int)reader.RetrieveNext();
                    var name   = (string)reader.RetrieveNext();
                    var kind   = (SymbolType)(int)reader.RetrieveNext();
                    var symbol = new Symbol(index, name, kind);
                    AddSymbol(symbol);
                    break;

                case RecordId.CharSets:
                    index = (int)reader.RetrieveNext();
                    var charset = (string)reader.RetrieveNext();
                    AddCharset(index, charset);
                    break;

                case RecordId.Rules:
                    index = (int)reader.RetrieveNext();
                    var head = _symbols[(int)reader.RetrieveNext()];
                    var rule = new Rule(index, head);
                    reader.RetrieveNext();
                    while ((obj = reader.RetrieveNext()) != null)
                    {
                        rule.AddItem(_symbols[(int)obj]);
                    }
                    AddRule(rule);
                    break;

                case RecordId.DFAStates:
                    FAState fastate = new FAState();
                    index = (int)reader.RetrieveNext();
                    if ((bool)reader.RetrieveNext())
                    {
                        fastate.AcceptSymbol = (int)reader.RetrieveNext();
                    }
                    else
                    {
                        reader.RetrieveNext();
                    }
                    reader.RetrieveNext();
                    while (!reader.RetrieveDone())
                    {
                        var ci = (int)reader.RetrieveNext();
                        var ti = (int)reader.RetrieveNext();
                        reader.RetrieveNext();
                        fastate.AddEdge(_charsets[ci], ti);
                    }
                    AddDfaState(index, fastate);
                    break;

                case RecordId.LRTables:
                    LRActionTable table = new LRActionTable();
                    index = (int)reader.RetrieveNext();
                    reader.RetrieveNext();
                    while (!reader.RetrieveDone())
                    {
                        var sid    = (int)reader.RetrieveNext();
                        var action = (int)reader.RetrieveNext();
                        var tid    = (int)reader.RetrieveNext();
                        reader.RetrieveNext();
                        table.AddItem(_symbols[sid], (Action)action, tid);
                    }
                    AddLalrTable(index, table);
                    break;

                case RecordId.Comment:
                    Console.WriteLine("Comment record encountered");
                    break;

                default:
                    throw new ParserException("Wrong id for record");
                }
            }
        }