Esempio n. 1
0
        private void PrintTermCase(ITerminalSet firstSet)
        {
            var tokens = SetAsTokenDefinitions(firstSet);

            foreach (var token in tokens)
            {
                PrintLine($"case TokenKind.{token}:");
            }
        }
Esempio n. 2
0
 public void Union(ITerminalSet terminalSet, bool includeEpsilon = true)
 {
     foreach (var term in terminalSet.AsEnumerable())
     {
         if ((term != Epsilon) || (term == Epsilon && includeEpsilon))
         {
             _terminals.Add(term);
         }
     }
 }
Esempio n. 3
0
        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("};");
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
        }