/// <summary>
        /// Call point to start the processing.
        /// </summary>
        protected override void Process()
        {
            MessageLogSentInvoker("===========================================");
            MessageLogSentInvoker(" Comenzando proceso de análisis sintáctico");
            MessageLogSentInvoker("===========================================");

            SyntacticalRule startRule =
                SyntacticalRulesLibrary.Instance.StartRule;


            OnMatcherMatching(this,
                              new MatchingArgs(SyntacticalRulesLibrary.Instance.StartRule));

            TokenSequence inputTokens = new TokenSequence(startTokens);

            parsingResult = startRule.Match(ref inputTokens, out output);

            if (inputTokens.Count > 0)
            {
                // Not all tokens were matched, so the parsing process
                // was unsuccessfull.
                parsingResult = false;
            }

            ProcessFinishedInvoker();
        }
Пример #2
0
        public void RepeaterTestCase()
        {
            TokenSequence sequence = new TokenSequence();

            Token t = new Token("NUMBER");

            t.Text = "200.9";
            sequence.Append(t);

            t      = new Token("ADD");
            t.Text = "+";
            sequence.Append(t);

            t      = new Token("NUMBER");
            t.Text = "14";
            sequence.Append(t);

            t      = new Token("ADD");
            t.Text = "+";
            sequence.Append(t);

            t      = new Token("NUMBER");
            t.Text = "28";
            sequence.Append(t);

            SyntacticalRule rule = new SyntacticalRule("formula");

            SyntacticalExpression exp = new SyntacticalExpression();

            exp.FormatString = "{0}{1}";

            ExpressionTokenItem eti = new ExpressionTokenItem();

            eti.TokenType = "NUMBER";
            exp.Items.Add(eti);

            ExpressionGroupItem group = new ExpressionGroupItem();

            group.Modifier = ExpressionItemModifier.RepeatingNonCompulsory;

            eti           = new ExpressionTokenItem();
            eti.TokenType = "ADD";
            group.ChildrenItems.Add(eti);

            eti           = new ExpressionTokenItem();
            eti.TokenType = "NUMBER";
            group.ChildrenItems.Add(eti);


            group.FormatString = " + {1}";
            exp.Items.Add(group);
            rule.Expressions.Add(exp);

            string output;
            bool   res = rule.Match(ref sequence, out output);

            Assert.IsTrue(res, "Matching wasn't succesfull");
            Assert.AreEqual("200.9 + 14 + 28", output, "Output isn't correct.'");
        }
        /// <summary>
        /// Adds a rule to the rule list.
        /// </summary>
        /// <param name="rule">
        /// A <see cref="SyntacticalRule"/>
        /// </param>
        private void AddRule(SyntacticalRule rule)
        {
            string [] parts = rule.ToString().Split(':');

            TreeIter iter = synRulesModel.AppendValues(parts[0] + " :",
                                                       parts[1],
                                                       rule);

            synRulesTree.Selection.SelectIter(iter);


            synRulesTree.ScrollToCell(synRulesModel.GetPath(iter),
                                      synRulesTree.Columns[0],
                                      true, 0.5f, 0);
        }
        /// <summary>
        /// Removes the selected rule from the list.
        /// </summary>
        /// <param name="sender">
        /// A <see cref="System.Object"/>
        /// </param>
        /// <param name="args">
        /// A <see cref="EventArgs"/>
        /// </param>
        private void OnRmSynRuleBtnClicked(object sender, EventArgs args)
        {
            TreeIter selected;

            synRulesTree.Selection.GetSelected(out selected);

            // We retrieve the selected rule.
            SyntacticalRule rule =
                synRulesModel.GetValue(selected, 2) as SyntacticalRule;

            ResponseType res =
                ConfirmDialog.Show(syntacticalRulesManagerDialog,
                                   "¿Realemente quieres eliminar la regla «{0}»?",
                                   rule.Name);

            if (res == ResponseType.No)
            {
                // The user doesn't want the removal of the rule, so we abort.
                return;
            }

            // The user accepted, so there we go!
            synRulesModel.Remove(ref selected);
        }
        /// <summary>
        /// Launches the rule editor dialog for the selected rule.
        /// </summary>
        /// <param name="sender">
        /// A <see cref="System.Object"/>
        /// </param>
        /// <param name="args">
        /// A <see cref="EventArgs"/>
        /// </param>
        private void OnSynRuleEditBtnClicked(object sender, EventArgs args)
        {
            SyntacticalRuleEditorDialog dialog =
                new SyntacticalRuleEditorDialog(this);

            TreeIter iter;

            synRulesTree.Selection.GetSelected(out iter);

            dialog.Rule = synRulesModel.GetValue(iter, 2) as  SyntacticalRule;

            ResponseType res = dialog.Show();

            if (res == ResponseType.Ok)
            {
                SyntacticalRule rule  = dialog.Rule;
                string []       parts = rule.ToString().Split(':');
                synRulesModel.SetValue(iter, 0, parts[0] + " :");
                synRulesModel.SetValue(iter, 1, parts[1]);
                synRulesModel.SetValue(iter, 2, rule);
            }

            dialog.Destroy();
        }
Пример #6
0
        public void SumAndMultTestCase()
        {
            TokenSequence sequence = new TokenSequence();

            Token t = new Token("NUMBER");

            t.Text = "200.9";
            sequence.Append(t);

            t      = new Token("ADD");
            t.Text = "+";
            sequence.Append(t);

            t      = new Token("NUMBER");
            t.Text = "28";
            sequence.Append(t);

            t      = new Token("MULT");
            t.Text = "x";
            sequence.Append(t);

            t      = new Token("NUMBER");
            t.Text = "14";
            sequence.Append(t);

            SyntacticalRulesLibrary.Instance.ClearRules();

            SyntacticalRule rule = new SyntacticalRule("multiplicacion");

            SyntacticalRulesLibrary.Instance.AddRule(rule);

            SyntacticalExpression exp = new SyntacticalExpression();

            exp.FormatString = "{0}{1}";

            ExpressionTokenItem eti = new ExpressionTokenItem();

            eti.TokenType = "NUMBER";
            exp.Items.Add(eti);

            ExpressionGroupItem group = new ExpressionGroupItem();

            group.Modifier = ExpressionItemModifier.RepeatingNonCompulsory;

            eti           = new ExpressionTokenItem();
            eti.TokenType = "MULT";
            group.ChildrenItems.Add(eti);

            eti           = new ExpressionTokenItem();
            eti.TokenType = "NUMBER";
            group.ChildrenItems.Add(eti);

            group.FormatString = " x {1}";
            exp.Items.Add(group);
            rule.Expressions.Add(exp);

            rule = new SyntacticalRule("formula");
            SyntacticalRulesLibrary.Instance.AddRule(rule);

            exp = new SyntacticalExpression();
            exp.FormatString = "{0}{1}";

            ExpressionRuleCallItem esi = new ExpressionRuleCallItem();

            esi.RuleName = "multiplicacion";
            exp.Items.Add(esi);

            group          = new ExpressionGroupItem();
            group.Modifier = ExpressionItemModifier.RepeatingNonCompulsory;

            eti           = new ExpressionTokenItem();
            eti.TokenType = "ADD";
            group.ChildrenItems.Add(eti);

            esi          = new ExpressionRuleCallItem();
            esi.RuleName = "multiplicacion";
            group.ChildrenItems.Add(esi);


            group.FormatString = " + {1}";
            exp.Items.Add(group);
            rule.Expressions.Add(exp);



            string output;
            bool   res = rule.Match(ref sequence, out output);

            Assert.IsTrue(res, "Matching wasn't succesfull");
            Assert.AreEqual("200.9 + 28 x 14", output, "Output isn't correct.'");
        }