예제 #1
0
        public static void CorrectFindLessAndEqualAndGreateSets_WhenG31()
        {
            var grammar = GrammarParser.Parse("S aFSb", "S c", "F Fb", "F b");

            var precedence = new GrammarPrecedence(grammar);

            precedence.Less.Select(p => (p.Item1.Value, p.Item2.Value))
            .Should()
            .BeEquivalentTo(('a', 'F'), ('a', 'b'), ('F', 'a'), ('F', 'c'), ('^', 'S'), ('^', 'a'), ('^', 'c'));

            precedence.Equal.Select(p => (p.Item1.Value, p.Item2.Value))
            .Should()
            .BeEquivalentTo(('a', 'F'), ('F', 'S'), ('S', 'b'), ('F', 'b'));

            precedence.Greater.Select(p => (p.Item1.Value, p.Item2.Value))
            .Should()
            .BeEquivalentTo(('b', 'a'), ('b', 'c'), ('b', 'b'), ('c', 'b'), ('S', '$'), ('b', '$'), ('c', '$'));
        }
예제 #2
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine($"FormalGrammar.exe [in-filename] [out-filename]");
                return;
            }

            var(rules, strings, ntOrder) = ReadInput(args[0]);

            var grammar           = GrammarParser.Parse(rules);
            var grammarPrecedence = new GrammarPrecedence(grammar);

            var view  = new GrammarPrecedenceView(s => OrderSymbols(s, ntOrder));
            var table = view.ToTable(grammarPrecedence);

            var analyzer = new GrammarAnalyzer(grammarPrecedence);
            var type     = analyzer.IsSimplePrecedence ? "S" : (analyzer.IsWeakPrecedence ? "W" : "N");

            var analyzings = analyzer.IsWeakPrecedence ? strings.Select(s => AnalyzeString(analyzer, s)) : new List <string>();

            File.WriteAllText(args[1], $"{table}\r\n{type}\r\n\r\n{string.Join("\r\n", analyzings)}", Encoding.UTF8);
        }