Exemplo n.º 1
0
        bool Factor(out List<List<Lr0Symbol>> symbolList)
        {
            symbolList = new List<List<Lr0Symbol>>();
            bool result = true;
            if (term(TokenType.Ident, false) || term(TokenType.String, false) || term(TokenType.Char, false)
                    || term(TokenType.LEFTPAR, false) || term(TokenType.LEFTSQUARE, false) || term(TokenType.LEFTCURLY, false) || term(TokenType.SemAction, false))
            {
                do
                {
                    if (term(TokenType.Ident, false) || term(TokenType.String, false) || term(TokenType.Char, false))
                    {
                        Lr0Symbol innerSymbol = new Lr0Symbol();
                        result = result && ParserSymbol(out innerSymbol);
                        if (term(TokenType.Attributes, false))
                        {
                            result = result && term(TokenType.Attributes, true);
                        }
                        List<Lr0Symbol> tempList = new List<Lr0Symbol>();
                        tempList.Add(innerSymbol);
                        symbolList.Add(tempList);

                        if (result)
                        {
                            form.appendText("Parsed TokenFactor \n");
                        }
                        return result;
                    }

                    if (term(TokenType.LEFTPAR, false))
                    {
                        result = result && term(TokenType.LEFTPAR, true)
                            && Expression(out symbolList)
                            && term(TokenType.RIGHTPAR, true);

                        if (result)
                        {
                            form.appendText("Parsed TokenFactor \n");
                        }
                        return result;
                    }

                    if (term(TokenType.LEFTSQUARE, false))
                    {
                        result = result && term(TokenType.LEFTSQUARE, true)
                            && Expression(out symbolList)
                            && term(TokenType.RIGHTSQUARE, true);

                        if (result)
                        {
                            form.appendText("Parsed TokenFactor \n");
                        }
                        return result;
                    }

                    if (term(TokenType.LEFTCURLY, false))
                    {
                        result = result && term(TokenType.LEFTCURLY, true)
                            && Expression(out symbolList)
                            && term(TokenType.RIGHTCURLY, true);

                        if (result)
                        {
                            form.appendText("Parsed TokenFactor \n");
                        }
                        return result;
                    }

                    if (term(TokenType.SemAction, false))
                    {
                        result = result && term(TokenType.SemAction, true);

                        if (result)
                        {
                            form.appendText("Parsed TokenFactor \n");
                        }
                    }
                }
                while (term(TokenType.Ident, false) || term(TokenType.String, false) || term(TokenType.Char, false)
                    || term(TokenType.LEFTPAR, false) || term(TokenType.LEFTSQUARE, false) || term(TokenType.LEFTCURLY, false));
            }
            else
            {
                return false;
            }
            if (result)
            {
                form.appendText("Parsed TokenFactor \n");
            }
            return result;
        }
Exemplo n.º 2
0
        bool ParserSymbol(out Lr0Symbol theSymbol)
        {
            theSymbol = new Lr0Symbol();
            bool result = true;
            if (term(TokenType.Ident, false) || term(TokenType.String, false) || term(TokenType.Char, false))
            {
                string currentString = tokenEnumerator.Current.getValue();
                if (term(TokenType.Ident, false))
                {
                    bool isToken = false;
                    foreach (LexerToken t in tokenDefinitions)
                    {
                        if (currentString == t.Identifier)
                        {
                            theSymbol = new Lr0Symbol(t.Identifier, t.Identifier);
                            isToken = true;
                        }
                    }
                    if (!isToken)
                    {
                        if (currentString == "$")
                            theSymbol = Lr0GenerationHelper.getEndSymbol();
                        else if (currentString == "3")
                            theSymbol = Lr0GenerationHelper.getEpsylonSymbol();
                        else
                            theSymbol = new Lr0Symbol(currentString);
                    }
                    result = result && term(TokenType.Ident, true);
                    if (result)
                    {
                        form.appendText("Parsed ParseSymbol \n");
                    }
                    return result;
                }

                if (term(TokenType.String, false))
                {

                    string tmpString = LexerGenerationHelper.getStringValue(currentString);
                    if (tmpString == "$")
                    {
                        theSymbol = Lr0GenerationHelper.getEndSymbol();
                    }
                    else if (tmpString == "3")
                    {
                        theSymbol = Lr0GenerationHelper.getEpsylonSymbol();
                    }
                    else
                    {
                        List<LexerToken> oldDefinitions = new List<LexerToken>(tokenDefinitions);
                        tokenDefinitions = new List<LexerToken>();
                        LexerToken tmpToken = new LexerToken();
                        theSymbol = new Lr0Symbol(currentString);
                        tokenDefinitions.Add(new LexerToken(Lr0GenerationHelper.getSafeName(tmpString), tmpString));
                        foreach (LexerToken oldToken in oldDefinitions)
                        {
                            tokenDefinitions.Add(oldToken);
                        }
                        theSymbol = new Lr0Symbol(Lr0GenerationHelper.getSafeName(tmpString), tmpString);
                    }
                    result = result && term(TokenType.String, true);
                    if (result)
                    {
                        form.appendText("Parsed ParseSymbol \n");
                    }
                    return result;
                }

                if (term(TokenType.Char, false))
                {
                    string tmpString = LexerGenerationHelper.getCharValue(currentString).ToString();
                    if (tmpString == "$")
                    {
                        theSymbol = Lr0GenerationHelper.getEndSymbol();
                    }
                    else if (tmpString == "3")
                    {
                        theSymbol = Lr0GenerationHelper.getEpsylonSymbol();
                    }
                    else
                    {
                    List<LexerToken> oldDefinitions = new List<LexerToken>(tokenDefinitions);
                    tokenDefinitions = new List<LexerToken>();
                    tokenDefinitions.Add(new LexerToken(Lr0GenerationHelper.getSafeName(tmpString), tmpString));
                    foreach (LexerToken oldToken in oldDefinitions)
                    {
                        tokenDefinitions.Add(oldToken);
                    }
                    theSymbol = new Lr0Symbol(Lr0GenerationHelper.getSafeName(tmpString), tmpString);
                    }
                    result = result && term(TokenType.Char, true);
                    if (result)
                    {
                        form.appendText("Parsed ParseSymbol \n");
                    }
                    return result;
                }
            }
            else
            {
                return false;
            }

            return result;
        }
Exemplo n.º 3
0
        public List<Item> GetGotoItems(Lr0Symbol theSymbol)
        {
            List<Item> ResultSet = new List<Item>();
            foreach (Item Production in itemSet)
            {
                if (!Production.isFinal())
                {
                    if (Production.getCurrentSymbol().Equals(theSymbol))
                    {
                        Item ItemToAdd = new Item(Production.Rule, Production.Position + 1);
                        ResultSet.Add(ItemToAdd);
                    }
                }
            }

            return ResultSet;
        }