public void TestInt32Values()
		{
			var sample = "123,+123,-123";

			var grammar = new Grammar();
			var num = new NumberParser { AllowSign = true, AllowDecimal = true, ValueType = typeof(int) };

			grammar.Inner = (+num.Named("str")).SeparatedBy(",");

			var match = grammar.Match(sample);
			Assert.IsTrue(match.Success, match.ErrorMessage);
			CollectionAssert.AreEquivalent(new Int32[] { 123, 123, -123 }, match.Find("str").Select(m => (int)m.Value));
		}
		public void TestExponent()
		{
			var sample = "123E-02,123E+10,123.4567E+5,1234E2";

			var grammar = new Grammar();
			var num = new NumberParser { AllowDecimal = true, AllowExponent = true };

			grammar.Inner = (+num.Named("str")).SeparatedBy(",");

			var match = grammar.Match(sample);
			Assert.IsTrue(match.Success, match.ErrorMessage);
			CollectionAssert.AreEquivalent(new Decimal[] { 123E-2M, 123E+10M, 123.4567E+5M, 1234E+2M }, match.Find("str").Select(m => num.GetValue(m)));
		}
		public void TestSign()
		{
			var sample = "123.4567,+123.4567,-123.4567";

			var grammar = new Grammar();
			var num = new NumberParser { AllowSign = true, AllowDecimal = true };

			grammar.Inner = (+num.Named("str")).SeparatedBy(",");

			var match = grammar.Match(sample);
			Assert.IsTrue(match.Success, match.ErrorMessage);
			CollectionAssert.AreEquivalent(new Decimal[] { 123.4567M, 123.4567M, -123.4567M }, match.Find("str").Select(m => num.GetValue(m)));
		}
			public CarGrammar():base("procedure")
			{
				var writables = ((Parser)"[brake]" | "[throttle]").Named("telemetry");
				var readables = (writables | "[velocity]").Named("telemetry");
				var number = new Eto.Parse.Parsers.NumberParser { AllowDecimal = true, AllowExponent = true, AllowSign = false }; 
				// (it sure would be nice to specify a range on that number)
				// - please file an enhancement request on github (;
				var writer = ((Parser)"set").Named("action") & WS & writables & WS & "at" & WS & number.Named("value") & ~WS & ~(Parser)"%";
				var op = ((Parser)"<" | ">" | "=").Named("operator");
				var unit = ((Parser)"m/s" | "kph" | "mph").Named("unit");
				var reader = ((Parser)"until").Named("action") & WS & readables & WS & op & ~WS & ~unit;

				var row = (~(reader | writer) & Terminals.Eol).Named("row");
				Inner = +row & ~row; 
				// the optional at the end will never match, since it will be consumed by +row.
				// however, it will give us the expected results for the next line.
			}
Exemplo n.º 5
0
            public CarGrammar() : base("procedure")
            {
                var writables = ((Parser)"[brake]" | "[throttle]").Named("telemetry");
                var readables = (writables | "[velocity]").Named("telemetry");
                var number    = new Eto.Parse.Parsers.NumberParser {
                    AllowDecimal = true, AllowExponent = true, AllowSign = false
                };
                // (it sure would be nice to specify a range on that number)
                // - please file an enhancement request on github (;
                var writer = ((Parser)"set").Named("action") & WS & writables & WS & "at" & WS & number.Named("value") & ~WS & ~(Parser)"%";
                var op     = ((Parser)"<" | ">" | "=").Named("operator");
                var unit   = ((Parser)"m/s" | "kph" | "mph").Named("unit");
                var reader = ((Parser)"until").Named("action") & WS & readables & WS & op & ~WS & ~unit;

                var row = (~(reader | writer) & Terminals.Eol).Named("row");

                Inner = +row & ~row;
                // the optional at the end will never match, since it will be consumed by +row.
                // however, it will give us the expected results for the next line.
            }
Exemplo n.º 6
0
        public EbnfGrammar()
            : base("ebnf")
        {
            DefineCommonNonTerminals = true;
            GenerateSpecialSequences();

            // terminals
            var terminal_string = ("'" & (+Terminals.AnyChar).Until("'").WithName("value") & "'")
                | ("\"" & (+Terminals.AnyChar).Until("\"").WithName("value") & "\"")
                | ("’" & (+Terminals.AnyChar).Until("’").WithName("value") & "’");

            var special_sequence = ("?" & (+Terminals.AnyChar).Until("?").WithName("name") & "?").WithName("special sequence");

            var meta_identifier_terminal = Terminals.Letter & -(Terminals.LetterOrDigit | '_');
            var integer = new NumberParser();

            var old = Parser.DefaultSeparator;
            Parser.DefaultSeparator = cws;

            // nonterminals
            var definition_list = new UnaryParser("definition list");
            var single_definition = new UnaryParser("single definition");
            var term = new UnaryParser("term");
            var primary = new UnaryParser("primary");
            var exception = new UnaryParser("exception");
            var factor = new UnaryParser("factor");
            var meta_identifier = new UnaryParser("meta identifier");
            var syntax_rule = new UnaryParser("syntax rule");
            var rule_equals = new UnaryParser("equals");

            var optional_sequence = ("[" & definition_list & "]").WithName("optional sequence");
            var repeated_sequence = ("{" & definition_list & "}").WithName("repeated sequence");
            var grouped_sequence = ("(" & definition_list & ")").WithName("grouped sequence");

            // rules
            meta_identifier.Inner = (+meta_identifier_terminal).SeparatedBy(ws);
            primary.Inner = optional_sequence | repeated_sequence
                | special_sequence | grouped_sequence
                | meta_identifier | terminal_string.Named("terminal string") | null;
            factor.Inner = ~(integer.Named("integer") & "*") & primary;
            term.Inner = factor & ~("-" & exception);
            exception.Inner = term;
            single_definition.Inner = term & -("," & term);
            definition_list.Inner = single_definition & -("|" & single_definition);
            rule_equals.Inner = (Parser)"=" | ":=";
            syntax_rule.Inner = meta_identifier & rule_equals & definition_list & ";";

            this.Inner = cws & +syntax_rule & cws;

            Parser.DefaultSeparator = old;

            AttachEvents();
        }