コード例 #1
0
        public static void SetupNewProgram(ref TreeNode <string> root, ref Grammar grammar, List <TypeSpec> typeSpecs, Random random, int input_arg_limit, ref List <Parameter> parameters)
        {
            parameters = new List <Parameter>();

            if (input_arg_limit == 2)
            {
                var inputParameter_1 = new Parameter()
                {
                    index         = 1,
                    parameterType = ParameterType.Input,
                    argType       = ArgType.List,
                    obj           = $"x1"
                };
                parameters.Add(inputParameter_1);

                var inputParameter_2 = new Parameter()
                {
                    index         = 2,
                    parameterType = ParameterType.Input,
                    argType       = ArgType.Int,
                    obj           = $"x2"
                };
                parameters.Add(inputParameter_2);
            }
            else
            {
                for (int i = 1; i <= input_arg_limit; i++)
                {
                    var inputParameter = new Parameter()
                    {
                        index         = i,
                        parameterType = ParameterType.Input,
                        argType       = random.EnumValue <ArgType>(),
                        obj           = $"x{i}"
                    };
                    parameters.Add(inputParameter);
                }
            }

            var outputParameter = new Parameter()
            {
                index         = 0,
                parameterType = ParameterType.Output,
                argType       = ArgType.List,
                obj           = $"y"
            };

            parameters.Add(outputParameter);

            root    = new TreeNode <string>();
            grammar = GrammarBuilder.Build(Resources.path_grammarSpec, typeSpecs, random, parameters);
        }
コード例 #2
0
        private static Tokenizer <TokenType> CreateParserForProcess()
        {
            var builder = new GrammarBuilder <TokenType>()
            {
                new Grammar <TokenType>(TokenType.Space, " "),
                new Grammar <TokenType>(TokenType.Equal, "="),
                new Grammar <TokenType>(TokenType.Process, "PROCESS"),
                new Grammar <TokenType>(TokenType.Produce, "PRODUCE"),
                new Grammar <TokenType>(TokenType.Comma, ","),
                new Grammar <TokenType>(TokenType.Using, "USING"),
                new Grammar <TokenType>(TokenType.SemiColon, ";"),
            };

            return(builder.Build());
        }
コード例 #3
0
        public void preposition_first()
        {
            var tokens = new List <string>()
            {
                "on", "x"
            };
            var grammarBuilder = new GrammarBuilder(tokens);
            var results        = grammarBuilder.Build();

            Assert.AreEqual(4, results.Count);
            Assert.IsTrue(results.Contains("on <noun>"));
            Assert.IsTrue(results.Contains("on <held>"));
            Assert.IsTrue(results.Contains("on <multi>"));
            Assert.IsTrue(results.Contains("on <multiheld>"));
        }
コード例 #4
0
        private static Tokenizer <TokenType> CreateParserForReduce(StringComparison stringComparison = StringComparison.Ordinal)
        {
            var builder = new GrammarBuilder <TokenType>(stringComparison)
            {
                new Grammar <TokenType>(TokenType.Space, " "),
                new Grammar <TokenType>(TokenType.Equal, "="),
                new Grammar <TokenType>(TokenType.Reduce, "REDUCE"),
                new Grammar <TokenType>(TokenType.Produce, "PRODUCE"),
                new Grammar <TokenType>(TokenType.On, "ON"),
                new Grammar <TokenType>(TokenType.Comma, ","),
                new Grammar <TokenType>(TokenType.Using, "USING"),
                new Grammar <TokenType>(TokenType.SemiColon, ";"),
            };

            return(builder.Build());
        }
コード例 #5
0
        public void object_only()
        {
            var tokens = new List <string>()
            {
                "x"
            };
            var grammarBuilder = new GrammarBuilder(tokens);

            var results = grammarBuilder.Build();

            Assert.AreEqual(4, results.Count);
            Assert.IsTrue(results.Contains("<noun>"));
            Assert.IsTrue(results.Contains("<held>"));
            Assert.IsTrue(results.Contains("<multi>"));
            Assert.IsTrue(results.Contains("<multiheld>"));
        }
コード例 #6
0
        public void with_indirect_object()
        {
            var tokens = new List <string>()
            {
                "x", "with", "y"
            };
            var grammarBuilder = new GrammarBuilder(tokens);
            var results        = grammarBuilder.Build();

            Assert.AreEqual(8, results.Count);
            Assert.IsTrue(results.Contains("<noun> with <noun>"));
            Assert.IsTrue(results.Contains("<held> with <noun>"));
            Assert.IsTrue(results.Contains("<multi> with <noun>"));
            Assert.IsTrue(results.Contains("<multiheld> with <noun>"));
            Assert.IsTrue(results.Contains("<noun> with <held>"));
            Assert.IsTrue(results.Contains("<held> with <held>"));
            Assert.IsTrue(results.Contains("<multi> with <held>"));
            Assert.IsTrue(results.Contains("<multiheld> with <held>"));
        }
コード例 #7
0
        public void Generate()
        {
            grammarBuilder.Build();

            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }

            //GenerateNodeInterface();
            GenerateVocabulary();
            GenerateTerminalNodes();
            GenerateNonTerminalsNode();


            table = new LALRTable(grammarBuilder);
            table.Build();

            GenereteParserFile();

            InsertInProjectFile();
        }
コード例 #8
0
        static void Main(string[] args)
        {
            var grammar = new GrammarBuilder();

            grammar.DefineTerminal("tk_package", false, (int)TokenDefine.Token, "package");
            grammar.DefineTerminal("tk_public", (int)TokenDefine.Token, "public");
            grammar.DefineTerminal("tk_final", (int)TokenDefine.Token, "final");
            grammar.DefineTerminal("tk_class", (int)TokenDefine.Token, "class");
            grammar.DefineTerminal("tk_void", (int)TokenDefine.Token, "void");
            grammar.DefineTerminal("tk_static", (int)TokenDefine.Token, "static");

            grammar.DefineTerminal("tk_semicolon", false, (int)TokenDefine.Semicolon);
            grammar.DefineTerminal("tk_dot", false, (int)TokenDefine.Dot);
            grammar.DefineTerminal("tk_open_brace", false, (int)TokenDefine.OpenBrace);
            grammar.DefineTerminal("tk_close_brace", false, (int)TokenDefine.CloseBrace);

            grammar.DefineTerminal("identifier", (int)TokenDefine.Token, "[a-zA-Z]+[a-zA-Z0-9]*");

            grammar.DefineRoot("class_definition");
            grammar.DefineRoot("package_sentences", "class_definition");

            grammar.ParseNonTerminal("package_sentences", true, "package_sentence*");
            grammar.ParseNonTerminal("package_sentence", true, "tk_package identifier(tk_dot identifier)* tk_semicolon");

            grammar.DefineNonTerminal("class_modifiers", true, "tk_public", "tk_final");
            grammar.DefineNonTerminal("class_definition", "class_modifiers", "tk_class", "identifier", "tk_open_brace", "functions", "tk_close_brace");

            grammar.ParseNonTerminal("functions", true, "function_definition*");
            grammar.DefineNonTerminal("function_definition", "tk_public", "tk_static", "tk_void", "identifier", "tk_open_brace", "tk_close_brace");

            var parser = grammar.Build();
            var parse  = new MyParser();
            var tokens = parse.ParseFile(@"G:\workspace\SimpleParser\test.java");

            parser.Parse(tokens, new ASTVisitor());
        }
コード例 #9
0
        private void BuildCC0()
        {
            var projectDir = DirRef.ProjectDir();
            var cc0        = projectDir.Dir("..").Dir("LinguCC0");
            var genDir     = cc0.Dir("Gen");

            Environment.CurrentDirectory = genDir;

            var grammarSource = FileRef.From($"./Lingu.Grammar");
            var outs          = FileRef.From("./Lingu").Add(".Out");

            var raw = Parser.Parse(grammarSource);

            if (raw != null)
            {
                var builder = new GrammarBuilder(raw);

                var grammar = builder.Build();
                new Dumper(grammar).Dump(outs);

                var csharp = new CSharpWriter(grammar, grammarSource, genDir);
                csharp.Write();
            }
        }
コード例 #10
0
ファイル: UserInput.cs プロジェクト: jphamilton/Adventure.Net
        public InputResult Parse(string input)
        {
            var result = new InputResult();

            var tokenizer = new InputTokenizer();
            var tokens = tokenizer.Tokenize(input);

            Action removeVerbToken = () => tokens.RemoveAt(0);

            if (tokens.Count == 0)
            {
                result.Action = () =>
                {
                    Context.Parser.Print(L.DoNotUnderstand);
                    return true;
                };
                return result;
            }

            // there can be more than one match for verbs like "switch"
            // which has one class that handles "switch on" and another 
            // class that handles "switch off"
            var possibleVerbs = VerbList.GetVerbsByName(tokens[0]);

            if (possibleVerbs.Count == 0)
            {
                result.Verb = new NullVerb();
                result.Action = ErrorAction(L.VerbNotRecognized);
                return result;
            }
            
            if (possibleVerbs.Count == 1)
            {
                result.Verb = possibleVerbs.First();
            }
            //else { NOT sure what to do about multiple possible verbs here}


            // remove verb token
            removeVerbToken();

            var grammarTokens = new List<string>();
            bool hasPreposition = false;

            foreach (string token in tokens)
            {
                bool hasObject = result.Objects.Count > 0;

                var objects = Objects.WithName(token);
                
                if (!hasObject)
                {
                    var rooms = Rooms.WithName(token);
                    foreach (var room in rooms)
                    {
                        objects.Add(room);
                    }
                }
                
                if (objects.Count == 0)
                {
                    bool isDirection = possibleVerbs.Count == 1 && 
                                       Compass.Directions.Contains(token) &&
                                       result.Objects.Count == 0;
                    bool isPreposition = Prepositions.Contains(token);
                
                    if (isDirection)
                    {
                        possibleVerbs.Clear();
                        possibleVerbs.Add(VerbList.GetVerbByName(token));
                    }
                    else if (isPreposition)
                    {
                        hasPreposition = true;
                        grammarTokens.Add(token);
                        result.Preposition = token;
                    }
                    else if (token == K.ALL)
                    {
                       // result.Objects.AddRange(L.ObjectsInScope());
                        grammarTokens.Add(token);
                        result.IsAll = true;
                    }
                    else if (token == K.EXCEPT)
                    {
                        if (!result.IsAll && !result.Objects.Any())
                        {
                            result.Action = ErrorAction(L.CantSeeObject);
                            return result;
                        }
                        result.IsExcept = true;
                    }
                    else
                    {
                        if (result.IsPartial)
                        {
                            string partial = String.Format("I only understood you as far as wanting to {0} the {1}.", possibleVerbs[0].Name, result.Objects[0].Name);
                            result.Action = ErrorAction(partial);
                            return result;
                        }
                        
                        result.Action = ErrorAction(L.CantSeeObject);
                        return result;
                    }
                }
                else
                {
                    // need to implement "Which do you mean, the red cape or the black cape?" type behavior here
                    Object obj;
                    var ofInterest = objects.Where(x => x.InScope).ToList();
                    if (ofInterest.Count > 1)
                    {
                        obj = ofInterest.FirstOrDefault(x => x.InInventory);
                    }
                    else
                    {
                        obj = ofInterest.FirstOrDefault();
                    }
                    //-------------------------------------------------------------------------------------
                    
                    bool isIndirectObject = hasPreposition && hasObject;
                    
                    if (obj == null)
                    {
                        result.Action = ErrorAction(L.CantSeeObject);
                        return result;
                    }
                    
                    if (isIndirectObject)
                    {
                        grammarTokens.Add(K.INDIRECT_OBJECT_TOKEN);
                        result.IndirectObject = obj;
                    }
                    else if (result.IsExcept)
                    {
                        //result.Objects.Remove(obj);
                        result.Exceptions.Add(obj);
                    }
                    else
                    {
                        if (!grammarTokens.Contains(K.OBJECT_TOKEN))
                            grammarTokens.Add(K.OBJECT_TOKEN);
                        if (!result.Objects.Contains(obj))
                            result.Objects.Add(obj);
                        result.IsPartial = true;
                    }
                }

               
            }

            result.Pregrammar = string.Join(" ", grammarTokens.ToArray());

            var grammarBuilder = new GrammarBuilder(grammarTokens);
            var grammars = grammarBuilder.Build();

            FindVerb(result, possibleVerbs, grammars);

            if (result.Grammar == null)
            {
                var incomplete = new IncompleteInput();
                incomplete.Handle(result);
            }
            
            if (result.IsAll)
            {
                if (result.ObjectsMustBeHeld)
                {
                    result.Objects = result.Objects.Where(x => x.InInventory).ToList();
                }
                else
                {
                    result.Objects = L.ObjectsInScope();
                }
            }

            if (result.IsExcept)
            {
                result.Exceptions.ForEach(x => result.Objects.Remove(x));
            }

            return result;
        }