コード例 #1
0
ファイル: LR0Parser.cs プロジェクト: jxpxxzj/boss-Compiler
        private void makeItem()
        {
            int current = 0;

            for (int i = 0; i < Grammar.Productions.Count; i++)
            {
                var prod = new Production(Grammar.Productions[i].Name, Grammar.Productions[i].Left);
                for (var j = 0; j < Grammar.Productions[i].Right.Count; j++)
                {
                    var temp = Grammar.Productions[i].Right[j];
                    for (int k = 0; k <= temp.Count; k++)
                    {
                        var pe = new ProductionExpression()
                        {
                            Parent = Grammar.Productions[i]
                        };
                        pe.AddRange(temp);
                        if (pe.IsEpsilonExpression)
                        {
                            pe.Clear();
                            pe.Add(dotTerminal);
                            prod.Add(pe);
                            dic[prod.Left].Add(current);
                            current++;
                            break;
                        }
                        else
                        {
                            pe.Insert(k, dotTerminal);
                        }
                        prod.Add(pe);
                        dic[prod.Left].Add(current);
                        current++;
                    }
                    prodDict.Add(temp, new Tuple <int, int>(i, j));
                }
                items.AddRange(prod.Expand());
            }
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: CzerstfyChlep/Just-Trade-
        public Province(Label Lb)
        {
            ctrl = Lb;
            ID   = Form1.idstore;
            Form1.idstore++;
            ProvinceName = "None";
            Production.Add("wood", 0);
            Storage.Add("wood", 0);
            Production.Add("bricks", 0);
            Storage.Add("bricks", 0);
            Production.Add("wheat", 0);
            Storage.Add("wheat", 0);
            Production.Add("metals", 0);
            Storage.Add("metals", 0);
            Production.Add("tools", 0);
            Storage.Add("tools", 0);
            Production.Add("weapons", 0);
            Storage.Add("weapons", 0);
            Production.Add("wool", 0);
            Storage.Add("wool", 0);
            Production.Add("cloth", 0);
            Storage.Add("cloth", 0);
            Production.Add("furs", 0);
            Storage.Add("furs", 0);
            Production.Add("ale", 0);
            Storage.Add("ale", 0);
            Production.Add("wine", 0);
            Storage.Add("wine", 0);
            Production.Add("spices", 0);
            Storage.Add("spices", 0);
            Production.Add("meat", 0);
            Storage.Add("meat", 0);
            Production.Add("salt", 0);
            Storage.Add("salt", 0);
            Production.Add("hemps", 0);
            Storage.Add("hemps", 0);

            foreach (string s in Form1.ProductName)
            {
                BProduction.Add(s, 0);
                Shortage.Add(s, 0);
                Buildings.Add(s, 0);
                PriceModifier.Add(s, 100);
                PopulationUsage.Add(s, 0);
            }
            WarMode = false;
        }
コード例 #3
0
ファイル: LR0Parser.cs プロジェクト: jxpxxzj/boss-Compiler
 private void makeCmp(List <Production> cmp1, int i, AbstractTerminal ch)
 {
     for (int j = 0; j < Collections[i].Count; j++)
     {
         var str = Collections[i][j].Clone();
         int k;
         for (k = 0; k < str.Count; k++)
         {
             if (ReferenceEquals(str[k], dotTerminal))
             {
                 break;
             }
         }
         if (k != str.Count - 1 && str[k + 1] == ch)
         {
             str.RemoveAt(k);
             str.Insert(k + 1, dotTerminal);
             var pd = new Production(Collections[i][j].Parent.Left);
             pd.Add(str);
             cmp1.Add(pd);
         }
     }
 }
コード例 #4
0
        public void Test()
        {
            Symbols     symbols     = new Symbols();
            Productions productions = new Productions();
            Syntax      syntax      = new Syntax(symbols, productions);

            symbols.RegistTerm("a");
            symbols.RegistTerm("b");
            symbols.RegistTerm("c");

            symbols.RegistNonterm("S");
            symbols.RegistNonterm("A");
            symbols.RegistNonterm("B");
            symbols.RegistNonterm("C");
            symbols.RegistNonterm("D");

            Production S_AB = new Production("S");

            S_AB.Add("A").Add("B");
            Production S_bC = new Production("S");

            S_bC.Add("b").Add("C");
            Production A_ = new Production("A");

            A_.Add("");
            Production A_b = new Production("A");

            A_b.Add("b");
            Production B_ = new Production("B");

            B_.Add("");
            Production B_aD = new Production("B");

            B_aD.Add("a").Add("D");
            Production C_AD = new Production("C");

            C_AD.Add("A").Add("D");
            Production C_b = new Production("C");

            C_b.Add("b");
            Production D_aS = new Production("D");

            D_aS.Add("a").Add("S");
            Production D_c = new Production("D");

            D_c.Add("c");
            bool rs;

            rs = productions.Products.Add(S_AB); Assert.IsTrue(rs);
            rs = productions.Products.Add(S_bC); Assert.IsTrue(rs);
            rs = productions.Products.Add(A_); Assert.IsTrue(rs);
            rs = productions.Products.Add(A_b); Assert.IsTrue(rs);
            rs = productions.Products.Add(B_); Assert.IsTrue(rs);
            rs = productions.Products.Add(B_aD); Assert.IsTrue(rs);
            rs = productions.Products.Add(C_AD); Assert.IsTrue(rs);
            rs = productions.Products.Add(C_b); Assert.IsTrue(rs);
            rs = productions.Products.Add(D_aS); Assert.IsTrue(rs);
            rs = productions.Products.Add(D_c); Assert.IsTrue(rs);

            symbols.Show();
            productions.Show();

            syntax.CalculateEpsilonSet();
            Assert.IsTrue(syntax.EpsilonSet["S"]);
            Assert.IsTrue(syntax.EpsilonSet["A"]);
            Assert.IsTrue(syntax.EpsilonSet["B"]);
            Assert.IsFalse(syntax.EpsilonSet["C"]);
            Assert.IsFalse(syntax.EpsilonSet["D"]);

            syntax.CalculateFirstSet();
            var firstSet = syntax.FirstSet;

            foreach (var item in firstSet)
            {
                var key   = item.Key;
                var value = item.Value;
            }

            Assert.AreEqual(3, firstSet["S"].Count);
            Assert.AreEqual(2, firstSet["A"].Count);
            Assert.AreEqual(2, firstSet["B"].Count);
            Assert.AreEqual(3, firstSet["C"].Count);
            Assert.AreEqual(2, firstSet["D"].Count);
        }
コード例 #5
0
ファイル: LR0Parser.cs プロジェクト: jxpxxzj/boss-Compiler
        private void makeGo()
        {
            int m = Collections.Count;

            for (int t = 0; t < V.Count; t++)
            {
                var ch = V[t];
                for (int i = 0; i < m; i++)
                {
                    var cmp1 = new List <Production>();
                    makeCmp(cmp1, i, ch);
                    if (cmp1.Count == 0)
                    {
                        continue;
                    }
                    for (int j = 0; j < m; j++)
                    {
                        var cmp2 = new List <Production>();
                        for (int k = 0; k < Collections[j].Count; k++)
                        {
                            var str = Collections[j][k];
                            int x;
                            for (x = 0; x < str.Count; x++)
                            {
                                if (ReferenceEquals(str[x], dotTerminal))
                                {
                                    break;
                                }
                            }
                            if (x > 0 && str[x - 1] == ch)
                            {
                                var pd = new Production(Collections[j][k].Parent.Left);
                                pd.Add(str);
                                cmp2.Add(pd);
                            }
                        }
                        bool flag = true;
                        if (cmp2.Count != cmp1.Count)
                        {
                            continue;
                        }
                        for (int k = 0; k < cmp1.Count; k++)
                        {
                            if (cmp1[k] == cmp2[k])
                            {
                                continue;
                            }
                            else
                            {
                                flag = false;
                            }
                        }

                        if (flag)
                        {
                            if (!Go.ContainsKey(i))
                            {
                                Go.Add(i, new Dictionary <AbstractTerminal, int>());
                            }
                            if (!Go[i].ContainsKey(ch))
                            {
                                Go[i].Add(ch, j);
                            }
                        }
                    }
                }
            }
        }
コード例 #6
0
ファイル: LR0Parser.cs プロジェクト: jxpxxzj/boss-Compiler
        protected virtual void makeSet()
        {
            bool[] has = new bool[500];
            for (int i = 0; i < items.Count; i++)
            {
                if (items[i].Left == Grammar.BeginSymbol && ReferenceEquals(items[i].Right[0][0], dotTerminal))
                {
                    var temp    = new Closure();
                    var str     = items[i].Right[0];
                    var element = temp.Element;
                    element.Add(items[i].Right[0]);
                    int x = 0;
                    for (x = 0; x < str.Count; x++)
                    {
                        if (ReferenceEquals(str[x], dotTerminal))
                        {
                            break;
                        }
                    }

                    has    = new bool[500];
                    has[i] = true;
                    if (x != str.Count - 1)
                    {
                        var q = new Queue <ProductionExpression>();
                        q.Enqueue(str.SubExpr(x + 1, 1));
                        while (!(q.Count == 0))
                        {
                            var u = q.Peek();
                            q.Dequeue();
                            var id = dic[(NonTerminal)u[0]];
                            for (int j = 0; j < id.Count; j++)
                            {
                                int tx = id[j];
                                if (ReferenceEquals(items[tx].Right[0][0], dotTerminal))
                                {
                                    if (has[tx])
                                    {
                                        continue;
                                    }
                                    has[tx] = true;
                                    if ((items[tx].Right[0][1] is NonTerminal nt))
                                    {
                                        q.Enqueue(items[tx].Right[0].SubExpr(1, 1));
                                    }
                                    element.Add(items[tx].Right[0]);
                                }
                            }
                        }
                    }
                    Collections.Add(temp);
                }
            }

            for (int i = 0; i < Collections.Count; i++)
            {
                var temp = new Dictionary <AbstractTerminal, Closure>();
                for (int j = 0; j < Collections[i].Count; j++)
                {
                    var str = Collections[i][j].Clone();
                    int x   = 0;
                    for (; x < str.Count; x++)
                    {
                        if (ReferenceEquals(str[x], dotTerminal))
                        {
                            break;
                        }
                    }

                    if (x == str.Count - 1)
                    {
                        continue;
                    }
                    var y  = str[x + 1];
                    int ii = 0;
                    str.RemoveAt(x);
                    str.Insert(x + 1, dotTerminal);
                    var cmp = new Production(Collections[i][j].Parent.Left);
                    cmp.Add(str);
                    for (int k = 0; k < items.Count; k++)
                    {
                        if (items[k] == cmp)
                        {
                            ii = k;
                            break;
                        }
                    }

                    has = new bool[500];
                    if (!temp.ContainsKey(y))
                    {
                        temp.Add(y, new Closure());
                    }
                    var element = temp[y].Element;
                    element.Add(items[ii].Right[0]);
                    has[ii] = true;
                    x++;
                    if (x != str.Count - 1)
                    {
                        var q = new Queue <ProductionExpression>();
                        q.Enqueue(str.SubExpr(x + 1, 1));
                        while (!(q.Count == 0))
                        {
                            var u = q.Peek();
                            q.Dequeue();
                            List <int> id;
                            if (u[0] is NonTerminal nts)
                            {
                                id = dic[nts];
                                for (int d = 0; d < id.Count; d++)
                                {
                                    int tx = id[d];
                                    if (ReferenceEquals(items[tx].Right[0][0], dotTerminal))
                                    {
                                        if (has[tx])
                                        {
                                            continue;
                                        }
                                        has[tx] = true;
                                        if (items[tx].Right[0].Count > 1 && items[tx].Right[0][1] is NonTerminal nt)
                                        {
                                            q.Enqueue(items[tx].Right[0].SubExpr(1, 1));
                                        }

                                        element.Add(items[tx].Right[0]);
                                    }
                                }
                            }
                        }
                    }
                }
                foreach (var kp in temp)
                {
                    Collections.Add(kp.Value);
                }
                for (int k = 0; k < Collections.Count; k++)
                {
                    for (int j = k + 1; j < Collections.Count; j++)
                    {
                        if (Collections[k] == Collections[j])
                        {
                            Collections.RemoveAt(j);
                        }
                    }
                }
            }
        }
コード例 #7
0
        Production Loader()
        {
            Tests.TestNumberPaser();
            Production Root          = Factory.Or("CSGrammar");
            Production Class         = Factory.And("Class").Array().Node("Class");
            Production ClassBody     = Factory.Or("Class_Body").Node("ClassBody");
            Production Member        = Factory.And("Member").Node("ClassMember");
            Production Func          = Factory.And("Func").Node("ClassFunc");
            Production VType         = Factory.Or("Type").Node();
            Production Memory        = Factory.Or("Memory").Node();
            Production Permission    = Factory.Or("Permission").Node("Permission");
            Production Expressions   = Factory.Or("Expressions").Array();
            Production OP2           = Factory.Or("OP2").Node();
            Production OP3           = Factory.Or("OP3").Node();
            Production V             = Factory.Or("V").Node();
            Production Exp           = Factory.And("Exp");
            Production ExpDecl       = Factory.And("ExpDecl");
            Production LHS           = Factory.Or("LHS").Node("LHS");
            Production RHS           = Factory.Or("RHS").Node("RHS");
            Production ComExpression = Factory.And("ComExpression");
            Production Factor        = Factory.Or("Factor");
            Production ClassName     = Factory.Symbol(Grammar.ID);
            Production FuncName      = Factory.Symbol(Grammar.ID).Node("FuncName");
            Production MemberName    = Factory.Symbol(Grammar.ID).Node("MemberName");

            Production OneArg    = Factory.And("OneArg");
            Production Arg       = Factory.Symbol(Grammar.ID).Node("Arg");
            Production Arguments = Factory.Or("Arguments").Node();

            Production Var  = Factory.Symbol(Grammar.ID).Node("Var");
            Production Decl = Factory.And("Decl");

            Production OpAdd        = Factory.Symbol("+").Node("Op");
            Production OpSub        = Factory.Symbol("-").Node("Op");
            Production OpMul        = Factory.Symbol("*").Node("Op");
            Production OpDiv        = Factory.Symbol("/").Node("Op");
            Production VTypeID      = Factory.Symbol(Grammar.ID).Node("Type");
            Production LineComment  = Factory.And("LineComment");
            Production BlockComment = Factory.And("BlockComment");
            Production NewLine      = Factory.Symbol(Grammar.LineFeed);
            Production EOF          = Factory.Symbol(Grammar.Eof);

            LineComment.Add("//" + Grammar.Any + NewLine);
            BlockComment.Add("/*" + Grammar.Any + "*/");

            OP2.Add(OpAdd | OpSub);
            OP3.Add(OpMul | OpDiv);

            V.Add(Var);
            V.Add("(" + V + ")");

            Decl.Add(VType + Var);
            LHS.Add(Var | Decl);

            Factor.Add(V);
            Factor.Add(V + OP3 + Factor);
            Factor.Add("(" + Factor + ")");

            RHS.Add(V);
            RHS.Add(V + OP2 + Factor);
            RHS.Add(V + OP2 + RHS);
            RHS.Add(Factor + OP2 + RHS);
            RHS.Add("(" + RHS + ")");

            Exp.Add(LHS + "=" + RHS + ";");

            ExpDecl.Add(Decl + ";");

            Permission.Add(Grammar.Empty | TokenID.Permission);
            Memory.Add(Grammar.Empty | TokenID.Memory);
            VType.Add(VTypeID | TokenID.InnerType);

            Member.Add(Permission + Memory + VType + MemberName + ";");

            Expressions.Add(Exp | ExpDecl);

            ComExpression.Add("{" + Expressions + "}");

            OneArg.Add(VType + Arg);

            Arguments.Add(OneArg);
            Arguments.Add(OneArg + "," + Arguments);
            Arguments.Add(Grammar.Empty);

            Func.Add(Permission + Memory + VType + FuncName + "(" + Arguments + ")" + ComExpression);

            ClassBody.Add(Member | Func | Grammar.Empty);

            Class.Add(Permission + Memory + TokenID.Class + "{" + ClassName + ClassBody + "}");

            Root.Add(Class | EOF);

            return(Root);
        }