private void PrintTermCase(ITerminalSet firstSet) { var tokens = SetAsTokenDefinitions(firstSet); foreach (var token in tokens) { PrintLine($"case TokenKind.{token}:"); } }
public void Union(ITerminalSet terminalSet, bool includeEpsilon = true) { foreach (var term in terminalSet.AsEnumerable()) { if ((term != Epsilon) || (term == Epsilon && includeEpsilon)) { _terminals.Add(term); } } }
private void PrintFirstSet(ITerminalSet firstSet, string nodeId) { var tokens = SetAsTokenDefinitions(firstSet); PrintLine($"var firstSetOf{nodeId} = new[]"); PrintLine("{"); Indent(); PrintLine(string.Join(", ", tokens.Select(s => "TokenKind." + s))); Outdent(); PrintLine("};"); }
private void PrintKleene(ITerminalSet firstSet, string nodeId) { if (firstSet.AsEnumerable().Count() > 1) { PrintFirstSet(firstSet, nodeId); PrintLine($"while (firstSetOf{nodeId}.Contains(_scanner.CurrentToken.TokenKind))"); } else { var defs = SetAsTokenDefinitions(firstSet); PrintLine($"while (_scanner.CurrentToken.TokenKind == TokenKind.{defs.First()})"); } PrintLine("{"); Indent(); }
private List <string> SetAsTokenDefinitions(ITerminalSet firstSet) { var tokens = new List <string>(); foreach (var token in firstSet.AsEnumerable().Where(t => t != "$EPSILON$")) { var tokenDef = _tokens.FirstOrDefault(p => p.Image.Equals(token))?.Definition; if (tokenDef == null) { throw new SemanticErrorException($"Token definition for \"{token}\" not found."); } tokens.Add(tokenDef); } return(tokens); }