private static void addLeftMost(NormalProduction prod, Expansion exp) { if (exp is NonTerminal) { for (int i = 0; i < prod.LeIndex; i++) { if (prod.LeftExpansions[i] == ((NonTerminal)exp).Production) { return; } } if (prod.LeIndex == prod.LeftExpansions.Length) { NormalProduction[] newle = new NormalProduction[prod.LeIndex * 2]; Array.Copy(prod.LeftExpansions, 0, newle, 0, prod.LeIndex); prod.LeftExpansions = newle; } prod.LeftExpansions[prod.LeIndex++] = ((NonTerminal)exp).Production; } else if (exp is OneOrMore) { addLeftMost(prod, ((OneOrMore)exp).Expansion); } else if (exp is ZeroOrMore) { addLeftMost(prod, ((ZeroOrMore)exp).Expansion); } else if (exp is ZeroOrOne) { addLeftMost(prod, ((ZeroOrOne)exp).Expansion); } else if (exp is Choice) { foreach (var choice in ((Choice)exp).Choices) { addLeftMost(prod, choice); } } else if (exp is Sequence) { foreach (var unit in ((Sequence)exp).Units) { addLeftMost(prod, unit); if (!EmptyExpansionExists(unit)) { break; } } } else if (exp is TryBlock) { addLeftMost(prod, ((TryBlock)exp).Expansion); } }
private static bool prodWalk(NormalProduction prod) { prod.WalkStatus = -1; for (int i = 0; i < prod.LeIndex; i++) { if (prod.LeftExpansions[i].WalkStatus == -1) { prod.LeftExpansions[i].WalkStatus = -2; loopString = prod.Lhs + "... --> " + prod.LeftExpansions[i].Lhs + "..."; if (prod.WalkStatus == -2) { prod.WalkStatus = 1; CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\""); return(false); } else { prod.WalkStatus = 1; return(true); } } else if (prod.LeftExpansions[i].WalkStatus == 0) { if (prodWalk(prod.LeftExpansions[i])) { loopString = prod.Lhs + "... --> " + loopString; if (prod.WalkStatus == -2) { prod.WalkStatus = 1; CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\""); return(false); } else { prod.WalkStatus = 1; return(true); } } } } prod.WalkStatus = 1; return(false); }
public static void addproduction(NormalProduction p) { CSharpCCGlobals.bnfproductions.Add(p); }
public static IList <MatchInfo> genFirstSet(IList <MatchInfo> partialMatches, Expansion exp) { if (exp is RegularExpression) { IList <MatchInfo> retval = new List <MatchInfo>(); for (int i = 0; i < partialMatches.Count; i++) { MatchInfo m = (MatchInfo)partialMatches[i]; MatchInfo mnew = new MatchInfo(); for (int j = 0; j < m.firstFreeLoc; j++) { mnew.match[j] = m.match[j]; } mnew.firstFreeLoc = m.firstFreeLoc; mnew.match[mnew.firstFreeLoc++] = ((RegularExpression)exp).Ordinal; if (mnew.firstFreeLoc == MatchInfo.laLimit) { sizeLimitedMatches.Add(mnew); } else { retval.Add(mnew); } } return(retval); } else if (exp is NonTerminal) { NormalProduction prod = ((NonTerminal)exp).Production; if (prod is CodeProduction) { return(new List <MatchInfo>()); } else { return(genFirstSet(partialMatches, prod.Expansion)); } } else if (exp is Choice) { IList <MatchInfo> retval = new List <MatchInfo>(); Choice ch = (Choice)exp; foreach (Expansion e in ch.Choices) { IList <MatchInfo> v = genFirstSet(partialMatches, e); listAppend(retval, v); } return(retval); } else if (exp is Sequence) { IList <MatchInfo> v = partialMatches; Sequence seq = (Sequence)exp; foreach (Expansion unit in seq.Units) { v = genFirstSet(v, unit); if (v.Count == 0) { break; } } return(v); } else if (exp is OneOrMore) { IList <MatchInfo> retval = new List <MatchInfo>(); IList <MatchInfo> v = partialMatches; OneOrMore om = (OneOrMore)exp; while (true) { v = genFirstSet(v, om.Expansion); if (v.Count == 0) { break; } listAppend(retval, v); } return(retval); } else if (exp is ZeroOrMore) { IList <MatchInfo> retval = new List <MatchInfo>(); listAppend(retval, partialMatches); IList <MatchInfo> v = partialMatches; ZeroOrMore zm = (ZeroOrMore)exp; while (true) { v = genFirstSet(v, zm.Expansion); if (v.Count == 0) { break; } listAppend(retval, v); } return(retval); } else if (exp is ZeroOrOne) { IList <MatchInfo> retval = new List <MatchInfo>(); listAppend(retval, partialMatches); listAppend(retval, genFirstSet(partialMatches, ((ZeroOrOne)exp).Expansion)); return(retval); } else if (exp is TryBlock) { return(genFirstSet(partialMatches, ((TryBlock)exp).Expansion)); } else if (considerSemanticLA && exp is Lookahead && ((Lookahead)exp).ActionTokens.Count != 0 ) { return(new List <MatchInfo>()); } else { IList <MatchInfo> retval = new List <MatchInfo>(); listAppend(retval, partialMatches); return(retval); } }
private static bool prodWalk(NormalProduction prod) { prod.WalkStatus = -1; for (int i = 0; i < prod.LeIndex; i++) { if (prod.LeftExpansions[i].WalkStatus == -1) { prod.LeftExpansions[i].WalkStatus = -2; loopString = prod.Lhs + "... --> " + prod.LeftExpansions[i].Lhs + "..."; if (prod.WalkStatus == -2) { prod.WalkStatus = 1; CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\""); return false; } else { prod.WalkStatus = 1; return true; } } else if (prod.LeftExpansions[i].WalkStatus == 0) { if (prodWalk(prod.LeftExpansions[i])) { loopString = prod.Lhs + "... --> " + loopString; if (prod.WalkStatus == -2) { prod.WalkStatus = 1; CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\""); return false; } else { prod.WalkStatus = 1; return true; } } } } prod.WalkStatus = 1; return false; }
private static void addLeftMost(NormalProduction prod, Expansion exp) { if (exp is NonTerminal) { for (int i = 0; i < prod.LeIndex; i++) { if (prod.LeftExpansions[i] == ((NonTerminal) exp).Production) return; } if (prod.LeIndex == prod.LeftExpansions.Length) { NormalProduction[] newle = new NormalProduction[prod.LeIndex*2]; Array.Copy(prod.LeftExpansions, 0, newle, 0, prod.LeIndex); prod.LeftExpansions = newle; } prod.LeftExpansions[prod.LeIndex++] = ((NonTerminal) exp).Production; } else if (exp is OneOrMore) addLeftMost(prod, ((OneOrMore) exp).Expansion); else if (exp is ZeroOrMore) addLeftMost(prod, ((ZeroOrMore) exp).Expansion); else if (exp is ZeroOrOne) addLeftMost(prod, ((ZeroOrOne) exp).Expansion); else if (exp is Choice) { foreach (var choice in ((Choice) exp).Choices) addLeftMost(prod, choice); } else if (exp is Sequence) { foreach (var unit in ((Sequence) exp).Units) { addLeftMost(prod, unit); if (!EmptyExpansionExists(unit)) break; } } else if (exp is TryBlock) addLeftMost(prod, ((TryBlock) exp).Expansion); }