private void SimplifyTokenOnlyRules() { List <string> RemoveRules = new List <string>(); foreach (RuleDeclaration rd in symbolTable._rules.Values) { bool flag = true; foreach (List <SubRulePart> branch in rd.SubRules) { if (branch.Count != 1) { flag = false; } else if (branch[0].GetType() != typeof(SubRulePart)) { flag = false; } else if (!branch[0].Name.StartsWith("\"")) { flag = false; } else if (branch[0].Repetition != SubRuleRepetition.Once) { flag = false; } } if (flag) { RemoveRules.Add(rd.Name); } } Dictionary <string, int> Literals = GetLiteralUsesCount(); foreach (string str in RemoveRules) { bool flag = true; RuleDeclaration rd = symbolTable._rules[str]; foreach (List <SubRulePart> branch in rd.SubRules) { if (Literals[branch[0].Name] != 1) { flag = false; } } if (!flag) { continue; } TokenDeclaration td = new TokenDeclaration(); td.Name = rd.Name; td.Location = rd.Location; foreach (List <SubRulePart> branch in rd.SubRules) { td.Values.Add(branch[0].Name); } symbolTable._rules.Remove(str); symbolTable._allNames.Remove(str); symbolTable.AddToken(td); } }
public void RemoveToken(TokenDeclaration token) { if (!_allNames.Contains(token.Name)) { return; } _tokens.Remove(token.Name); _allNames.Remove(token.Name); }
/// <summary> /// Заменяет именованные лексемы на списки строковых литералов /// </summary> /// <param name="l"></param> private void ReplaceTokensWithStrings(List <string> l, LexLocation location) { for (int i = 0; i < l.Count; ++i) { if (!l[i].StartsWith(StringConstants.StringQuote)) { TokenDeclaration td = symbolTable.FindTokenList(l[i]); if (td == null) { ErrorReporter.WriteError(ErrorMessages.NameNotDeclared, location, l[i]); } l.AddRange(td.Values); l.RemoveAt(i); --i; } } }
public string FindOrCreateToken(string Name) { string result = FindToken(Name); if (result != "") { return(result); } TokenDeclaration td = new TokenDeclaration(); td.Name = GetNewName(Name); td.Values.Add(Name); AddToken(td); return(td.Name); }
public void AddToken(TokenDeclaration token) { if (_allNames.Contains(token.Name)) { return; } foreach (string s in token.Values) { if (FindToken(s) != "") { ErrorReporter.WriteError(ErrorMessages.NameAlreadyDefined, token.Location, token.Name); return; } } _tokens.Add(token.Name, token); _allNames.Add(token.Name); }
public string FindOrCreateToken(string Name) { string result = FindToken(Name); if (result != "") return result; TokenDeclaration td = new TokenDeclaration(); td.Name = GetNewName(Name); td.Values.Add(Name); AddToken(td); return td.Name; }
public void RemoveToken(TokenDeclaration token) { if (!_allNames.Contains(token.Name)) return; _tokens.Remove(token.Name); _allNames.Remove(token.Name); }
public void AddToken(TokenDeclaration token) { if (_allNames.Contains(token.Name)) return; foreach (string s in token.Values) if (FindToken(s) != "") { ErrorReporter.WriteError(ErrorMessages.NameAlreadyDefined, token.Location, token.Name); return; } _tokens.Add(token.Name, token); _allNames.Add(token.Name); }
private void SimplifyTokenOnlyRules() { List<string> RemoveRules = new List<string>(); foreach (RuleDeclaration rd in symbolTable._rules.Values) { bool flag = true; foreach (List<SubRulePart> branch in rd.SubRules) { if (branch.Count != 1) flag = false; else if (branch[0].GetType() != typeof(SubRulePart)) flag = false; else if (!branch[0].Name.StartsWith("\"")) flag = false; else if (branch[0].Repetition != SubRuleRepetition.Once) flag = false; } if (flag) RemoveRules.Add(rd.Name); } Dictionary<string, int> Literals = GetLiteralUsesCount(); foreach (string str in RemoveRules) { bool flag = true; RuleDeclaration rd = symbolTable._rules[str]; foreach (List<SubRulePart> branch in rd.SubRules) if (Literals[branch[0].Name] != 1) flag = false; if (!flag) continue; TokenDeclaration td = new TokenDeclaration(); td.Name = rd.Name; td.Location = rd.Location; foreach (List<SubRulePart> branch in rd.SubRules) td.Values.Add(branch[0].Name); symbolTable._rules.Remove(str); symbolTable._allNames.Remove(str); symbolTable.AddToken(td); } }