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; }
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; }
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; }