Esempio n. 1
0
        protected override void Build()
        {
            base.Build();
            var simpleIdentifier = new Pattern("simpleIdentifier")
            {
                Data = identifier.Data
            };

            var identifierOrInline = new Pattern("identifierOrInline")
            {
                Data = new PrioritizedChoice(identifier,
                                             new CaptureGroup((int)ExtendedCaptureKeys.InlinePattern,
                                                              new Sequence(
                                                                  "\\(",
                                                                  spacing,
                                                                  internalExpression,
                                                                  ')'
                                                                  )
                                                              )
                                             )
            };

            // Prevent 'export' from being seen as a non-terminal
            // This effectively reserves export as a global keyword
            prefix.Data = new Sequence(new Not(CharacterClass.String("export")), prefix.Data);

            var parameterizedIdentifier            = BuildParameterizedIdentifier(simpleIdentifier, identifierOrInline);
            var parameterizedIdentifierDeclaration = BuildParameterizedIdentifier(simpleIdentifier, new CaptureGroup((int)ExtendedCaptureKeys.PatternParameterReference, simpleIdentifier));

            var complexIdentifier = new Pattern("complexIdentifier")
            {
                Data = new PrioritizedChoice(parameterizedIdentifier, simpleIdentifier)
            };

            var namespacedIdentifier = new Pattern("namespacedIdentifier");

            namespacedIdentifier.Data = new PrioritizedChoice(
                new CaptureGroup((int)ExtendedCaptureKeys.Namespace,
                                 new Sequence(simpleIdentifier, "::", namespacedIdentifier)
                                 ),
                complexIdentifier
                );

            identifier.Data = namespacedIdentifier;

            var possibleDeclarationIdentifiers = new PrioritizedChoice(parameterizedIdentifierDeclaration, simpleIdentifier);

            identifierDeclaration.Data = new PrioritizedChoice(
                new CaptureGroup((int)ExtendedCaptureKeys.Export,
                                 new Sequence("export", spacing, possibleDeclarationIdentifiers)
                                 ),
                possibleDeclarationIdentifiers
                );

            var number      = Operator.OneOrMore(new CharacterClass(new CharacterRange('0', '9')));
            var fixedRepeat = new CaptureGroup((int)ExtendedCaptureKeys.FixedRepeat, new Sequence(primary, '^', number, Operator.Optional(new Sequence("..", number))));

            suffix.Data = new PrioritizedChoice(new Sequence(fixedRepeat, spacing), suffix.Data);
        }
Esempio n. 2
0
        public void CompositeVisitor_CapturingGroup_SandBoxTest_PriorityChoice3()
        {
            var prefix = new PrioritizedChoice(
                new CapturingGroup("AndPredicate", new Literal {
                MatchText = "&"
            }),
                new CapturingGroup("NotPredicate", new Literal {
                MatchText = "!"
            })
                );

            PrioritizedChoice suffix = new PrioritizedChoice(
                new CapturingGroup("ZeroOrMore", new Literal {
                MatchText = "*"
            }),
                new CapturingGroup("OneOrMore", new Literal {
                MatchText = "+"
            })
                )
                                       .Or(new CapturingGroup("Optional", new Literal {
                MatchText = "?"
            }));

            var terminal = new CapturingGroup("AnyCharacter", new Literal {
                MatchText = "."
            });
            var expression = new CapturingGroup("Expression",
                                                new PrioritizedChoice(
                                                    // match prefixes first
                                                    prefix.Plus()
                                                    .Sequence(terminal)
                                                    ,
                                                    // match suffixes next
                                                    terminal
                                                    .Sequence(
                                                        suffix.Plus()
                                                        )
                                                    )
                                                .Or(terminal)
                                                .Plus()
                                                );

            var input    = ".";
            var bytes    = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor  = new NpegParserVisitor(iterator);

            expression.Accept(visitor);

            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;

            Assert.IsTrue(node.Children.Count == 1);
            Assert.IsTrue(node.Token.Name == "Expression");
            Assert.IsTrue(node.Token.ValueAsString(iterator) == ".");
            Assert.IsTrue(node.Children[0].Token.Name == "AnyCharacter");
        }
Esempio n. 3
0
        public void Choice()
        {
            var p = new PrioritizedChoice(letters, capitals);

            MustMatch(p, "a");
            MustMatch(p, "F");
            MustMatch(p, "z");
            MustNotMatch(p, "++");
            MustNotMatch(p, "Aa");
            MustNotMatch(p, "0");
            MustNotMatch(p, "");
            MustNotMatch(p, "+");
        }
Esempio n. 4
0
        public void RegexChoice()
        {
            var first  = new Sequence(new Any(), new Any(), new CharacterClass('S'));
            var second = new Sequence(new Any(), new Any(), new CharacterClass('T'));

            var p = new PrioritizedChoice(first, second);

            MustMatch(p, "abS");
            MustMatch(p, "zyT");
            MustMatch(p, "ccS");
            MustNotMatch(p, "a");
            MustNotMatch(p, "ff");
            MustNotMatch(p, "zzzzzzzz");
            MustNotMatch(p, "AbTs");
            MustNotMatch(p, "++++");
        }
Esempio n. 5
0
        public void ConcatenationInChoice()
        {
            var first  = new Sequence(new Any(), letters);
            var second = new Sequence(new Any(), new CharacterClass(new CharacterRange('A', 'Z')));

            var p = new PrioritizedChoice(first, second);

            MustMatch(p, "xa");
            MustMatch(p, ")F");
            MustMatch(p, "6z");
            MustNotMatch(p, "+");
            MustNotMatch(p, "A");
            MustNotMatch(p, "+");
            MustNotMatch(p, "");
            MustNotMatch(p, "++++++");
        }
        public override void VisitLeave(PrioritizedChoice expression)
        {
            terminal.Peek().Append(")");

            //String input = terminal.Pop().ToString();
            //if (!this.uniqueBranches.ContainsKey(input))
            //{
            //    String nodename = "node" + branchcount++;
            //    this.uniqueBranches.Add(input, nodename);
            //    this.statements.Add( String.Format("{0}: {1};", nodename, input) );
            //}

            //// remember last node is always a captured group so peek should not throw exceptions
            //// insert terminal name
            //terminal.Peek().Append(this.uniqueBranches[input]);
        }
Esempio n. 7
0
        public void NestedChoice()
        {
            var first  = new PrioritizedChoice(new CharacterClass('S'), letters);
            var second = new PrioritizedChoice(new CharacterClass('T'), capitals, new CharacterClass('.'));

            var p = new PrioritizedChoice(first, second);

            MustMatch(p, "S");
            MustMatch(p, "a");
            MustMatch(p, "T");
            MustMatch(p, ".");
            MustNotMatch(p, "");
            MustNotMatch(p, "ff");
            MustNotMatch(p, "zzzzzzzz");
            MustNotMatch(p, "AbTs");
            MustNotMatch(p, "++++");
        }
Esempio n. 8
0
 public abstract void VisitExecute(PrioritizedChoice expression);
        public override void VisitLeave(PrioritizedChoice expression)
        {
            IsMatchPredicate localRight = _matchStack.Pop();
            IsMatchPredicate localLeft  = _matchStack.Pop();

            _matchStack.Push(
                delegate(IInputIterator iterator)
            {
                Int32 savePosition = iterator.Index;

                _sandbox.Push(new Stack <AstNode>());
                _sandbox.Peek().Push(new AstNode());
                // create new sandbox which capturing group works in.
                // have a dummy node to act as parent container (CapturedGroup logic)

                if (localLeft(iterator))
                {
                    Stack <AstNode> s = _sandbox.Pop();
                    if (s.Count >= 1)
                    {
                        AstNode child = s.Pop();
                        if (_sandbox.Peek().Count == 0)
                        {
                            _sandbox.Peek().Push(child);
                        }
                        else
                        {
                            _sandbox.Peek().Peek().Children.AddRange(child.Children);
                            // our dummy node for this sandbox is child.
                            // move important data over to the previous sandbox.
                        }
                    }

                    return(true);
                }

                _sandbox.Pop();
                // destory sandbox since anything captured is no longer valid.


                iterator.Index = savePosition;


                _sandbox.Push(new Stack <AstNode>());
                _sandbox.Peek().Push(new AstNode());
                // create new sandbox which capturing group works in.
                // have a dummy node to act as parent container (CapturedGroup logic)

                if (localRight(iterator))
                {
                    Stack <AstNode> s = _sandbox.Pop();
                    if (s.Count >= 1)
                    {
                        AstNode child = s.Pop();
                        if (_sandbox.Peek().Count == 0)
                        {
                            _sandbox.Peek().Push(child);
                        }
                        else
                        {
                            _sandbox.Peek().Peek().Children.AddRange(child.Children);
                            // our dummy node for this sandbox is child.
                            // move important data over to the previous sandbox.
                        }
                    }

                    return(true);
                }

                _sandbox.Pop();
                // destory sandbox since anything captured is no longer valid.

                return(false);
            }
                );
        }
Esempio n. 10
0
        public RegexGrammar(PatternCompiler patternCompiler)
        {
            var RE       = new Pattern("RE");
            var simpleRE = new Pattern("SimpleRE");

            var metaCharacter = new Pattern("metaCharacter")
            {
                Data = new PrioritizedChoice(
                    new CharacterClass('*', '+', '^', '$', '|', '(', ')', '[', ']'),
                    new Sequence(new CharacterClass('\\'), new CharacterClass('t', 'n', 'r', 'f', 'b', 'B', 'd', 'D', 's', 'S', 'w', 'W', 'Q', 'U', 'L')),
                    CharacterClass.String(@"*?"),
                    CharacterClass.String(@"+?"),
                    CharacterClass.String(@"$`"),
                    CharacterClass.String(@"$'"),
                    CharacterClass.String(@"$&"),
                    CharacterClass.String(@"\cX"),
                    new Sequence(new CharacterClass('\\', '$'), CharacterClass.Range('0', '9')),
                    new Sequence(new CharacterClass('\\'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'))
                    )
            };

            var allowedMetaCharacters = new Pattern("allowedMetaCharacter")
            {
                Data = new CaptureGroup((int)CaptureType.MetaCharacter,
                                        new PrioritizedChoice(
                                            new Sequence(new CharacterClass('\\'), new CharacterClass('t', 'n', 'r', 'f', 'b', 'B', 'd', 'D', 's', 'S', 'w', 'W', 'Q', 'U', 'L')),
                                            CharacterClass.String(@"*?"),
                                            CharacterClass.String(@"+?"),
                                            CharacterClass.String(@"$`"),
                                            CharacterClass.String(@"$'"),
                                            CharacterClass.String(@"$&"),
                                            CharacterClass.String(@"\cX"),
                                            new Sequence(new CharacterClass('\\', '$'), CharacterClass.Range('0', '9')),
                                            new Sequence(new CharacterClass('\\'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'))
                                            )
                                        )
            };

            var character = new Pattern("character")
            {
                Data = new CaptureGroup((int)CaptureType.Char,
                                        new PrioritizedChoice(
                                            new Sequence(
                                                new CharacterClass('\\'),
                                                metaCharacter
                                                ),
                                            new Sequence(
                                                new Not(metaCharacter),
                                                new Any()
                                                )
                                            )
                                        )
            };

            var range    = new CaptureGroup((int)CaptureType.Range, new Sequence(character, new CharacterClass('-'), character));
            var setItem  = new PrioritizedChoice(range, character);
            var setItems = new Pattern()
            {
                Data = Operator.OneOrMore(setItem)
            };
            var positiveSet = new CaptureGroup((int)CaptureType.PositiveSet, new Sequence(new CharacterClass('['), setItems, new CharacterClass(']')));
            var negativeSet = new CaptureGroup((int)CaptureType.NegativeSet, new Sequence(CharacterClass.String("[^"), setItems, new CharacterClass(']')));
            var set         = new Pattern("set")
            {
                Data = new PrioritizedChoice(negativeSet, positiveSet)
            };
            var eos   = new CaptureGroup((int)CaptureType.Eos, new CharacterClass('$'));
            var any   = new CaptureGroup((int)CaptureType.Any, new CharacterClass('.'));
            var group = new Sequence(new CharacterClass('('), RE, new CharacterClass(')'));

            var elementaryRE = new Pattern("elementaryRE")
            {
                Data = new PrioritizedChoice(group, any, eos, set, character, allowedMetaCharacters)
            };

            var number      = Operator.OneOrMore(CharacterClass.Range('0', '9'));
            var repeatRange = new Sequence(new CharacterClass('{'), new CaptureGroup((int)CaptureType.RepeatRange, new Sequence(number, Operator.Optional(new Sequence(new CharacterClass(','), number)))), new CharacterClass('}'));

            var plus = new Pattern("plus")
            {
                Data = new CaptureGroup((int)CaptureType.Plus, new Sequence(elementaryRE, new CharacterClass('+')))
            };
            var star = new Pattern("star")
            {
                Data = new CaptureGroup((int)CaptureType.Star, new Sequence(elementaryRE, new CharacterClass('*')))
            };
            var repeat = new Pattern("repeat")
            {
                Data = new CaptureGroup((int)CaptureType.Repeat, new Sequence(elementaryRE, repeatRange))
            };
            var basicRE = new PrioritizedChoice(star, plus, repeat, elementaryRE);

            simpleRE.Data = new CaptureGroup((int)CaptureType.Concatenation, Operator.OneOrMore(basicRE));

            RE.Data = new CaptureGroup((int)CaptureType.Union, new Sequence(simpleRE, new ZeroOrMore(new Sequence(new CharacterClass('|'), RE))));

            Parser = patternCompiler.Compile(RE);
        }
Esempio n. 11
0
        public void CompositeVisitor_Recursiveness()
        {
            var whitespace = new CharacterClass {
                ClassExpression = "[ \t\r\n\v]"
            };

            var terminal = new PrioritizedChoice(
                new CapturingGroup("AnyCharacter", new Literal {
                MatchText = "."
            })
                ,
                new CapturingGroup("CapturingGroup",
                                   new Sequence(
                                       new Literal {
                MatchText = "(?<"
            },
                                       new CapturingGroup("ReplacementNode",
                                                          new OneOrMore(
                                                              new CharacterClass {
                ClassExpression = "[a-z0-9A-Z]"
            }
                                                              )
                                                          )
                                       )
                                   .Sequence(new Literal {
                MatchText = ">"
            })
                                   .Sequence(new RecursionCall("Expression"))
                                   .Sequence(new Literal {
                MatchText = ")"
            })
                                   )
                );

            var sequence = new CapturingGroup(
                "Sequence",
                new Sequence(
                    terminal,
                    new ZeroOrMore(whitespace)
                    ).Plus()
                )
            {
                DoReplaceBySingleChildNode = true
            };

            var prioritizedchoice = new CapturingGroup("PrioritizedChoice",
                                                       new Sequence(
                                                           sequence,
                                                           new Literal {
                MatchText = "/"
            }
                                                           )
                                                       .Sequence(new ZeroOrMore(whitespace))
                                                       .Sequence(sequence)
                                                       .Sequence(
                                                           new ZeroOrMore(
                                                               new Sequence(
                                                                   new ZeroOrMore(whitespace),
                                                                   new Literal {
                MatchText = "/"
            }
                                                                   )
                                                               .Sequence(new ZeroOrMore(whitespace))
                                                               .Sequence(sequence)
                                                               .Plus()
                                                               )
                                                           )
                                                       );

            var expression = new CapturingGroup("Root",
                                                new RecursionCreate("Expression",
                                                                    new PrioritizedChoice(prioritizedchoice, sequence)));


            var input    = @"(?<NPEGNode>./.. )";
            var bytes    = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor  = new NpegParserVisitor(iterator);

            expression.Accept(visitor);

            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;

            Assert.IsTrue(node.Token.Name == "Root");
            Assert.IsTrue(node.Children.Count == 1);
            Assert.IsTrue(node.Children.Count == 1);
            Assert.IsTrue(node.Children[0].Token.Name == "CapturingGroup");
            Assert.IsTrue(node.Children[0].Children.Count == 2);
            Assert.IsTrue(node.Children[0].Children[0].Token.Name == "ReplacementNode");
            Assert.IsTrue(node.Children[0].Children[1].Token.Name == "PrioritizedChoice");
            Assert.IsTrue(node.Children[0].Children[1].Children[0].Token.Name == "AnyCharacter");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Token.Name == "Sequence");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Children[0].Token.Name == "AnyCharacter");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Children[1].Token.Name == "AnyCharacter");
        }
        public void PracticalExample_MathematicalFormula()
        {
            #region Composite

            var VALUE = new PrioritizedChoice(
                new CapturingGroup("VALUE",
                                   new OneOrMore(new CharacterClass {
                ClassExpression = "[0-9]"
            })
                                   )
                ,
                new Sequence(
                    new Literal {
                MatchText = "("
            },
                    new RecursionCall("ParethesisFunction")
                    )
                .Sequence(new Literal {
                MatchText = ")"
            })
                );

            var PRODUCT = new Sequence(
                VALUE,
                new Sequence(
                    new CapturingGroup("SYMBOL",
                                       new PrioritizedChoice(
                                           new Literal {
                MatchText = "*"
            },
                                           new Literal {
                MatchText = "/"
            }
                                           )
                                       ),
                    VALUE
                    ).Star()
                );

            var SUM = new Sequence(
                PRODUCT,
                new Sequence(
                    new CapturingGroup("SYMBOL",
                                       new PrioritizedChoice(
                                           new Literal {
                MatchText = "+"
            },
                                           new Literal {
                MatchText = "-"
            }
                                           )
                                       ),
                    PRODUCT
                    ).Star()
                );

            AExpression EXPRESSION = new RecursionCreate("ParethesisFunction", new CapturingGroup("EXPRESSION", SUM));

            #endregion

            var input = "((((12/3)+5-2*(81/9))+1))";
            var bytes = Encoding.UTF8.GetBytes(input);

            var iterator = new ByteInputIterator(bytes);
            var visitor  = new NpegParserVisitor(iterator);
            EXPRESSION.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;


            Assert.IsTrue(node.Token.ValueAsString(iterator) == input);
        }
Esempio n. 13
0
        public void CompositeVisitor_CapturingGroup_SandBoxTest_PriorityChoice1()
        {
            PrioritizedChoice newline = new PrioritizedChoice(
                new Literal {
                MatchText = "\r\n"
            },                                                    // windows
                new Literal {
                MatchText = "\r\r"
            }                                                    // old macs
                )
                                        .Or(new Literal {
                MatchText = "\n"
            });                                                      // linux

            // Single Line Comment
            var singleLineComment = new Sequence(
                new Literal {
                MatchText = "//"
            },
                new Sequence(
                    new NotPredicate(newline),
                    new AnyCharacter()
                    )
                .Star()
                );

            // Multiline Comment
            var multiLineComment = new Sequence(
                new Literal {
                MatchText = "/*"
            },
                new Sequence(
                    new NotPredicate(new Literal {
                MatchText = "*/"
            }),
                    new AnyCharacter()
                    )
                .Star()
                .Sequence(new Literal {
                MatchText = "*/"
            })
                );

            var comment = new PrioritizedChoice(singleLineComment, multiLineComment);

            var whitespace = new PrioritizedChoice(
                new CharacterClass {
                ClassExpression = "[ \t\r\n\v]"
            },
                comment
                );

            var label = new CapturingGroup("Label",
                                           new Sequence(
                                               new CharacterClass {
                ClassExpression = "[a-zA-Z_]"
            },
                                               // must start with alpha character
                                               new ZeroOrMore(new CharacterClass {
                ClassExpression = "[a-zA-Z0-9_]"
            })
                                               )
                                           );

            var backreference = new CapturingGroup("DynamicBackReferencing",
                                                   new Sequence(
                                                       new Literal {
                MatchText = @"\k<"
            },
                                                       new Sequence(new ZeroOrMore(whitespace), label).Sequence(
                                                           new ZeroOrMore(whitespace))
                                                       )
                                                   .Sequence(
                                                       new Optional(
                                                           new Sequence(
                                                               new Sequence(
                                                                   new Literal {
                MatchText = "["
            },
                                                                   new CapturingGroup("CaseSensitive",
                                                                                      new Literal {
                MatchText = @"\i"
            }
                                                                                      )
                                                                   ),
                                                               new Literal {
                MatchText = "]"
            }
                                                               )
                                                           )
                                                       )
                                                   .Sequence(
                                                       new Sequence(new ZeroOrMore(whitespace), new Literal {
                MatchText = ">"
            })
                                                       )
                                                   );

            var root = new CapturingGroup("Test",
                                          new Sequence(
                                              backreference,
                                              new NotPredicate(new AnyCharacter())
                                              )
                                          );

            var input    = @"\k< CapturedLabelVariableName >";
            var bytes    = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor  = new NpegParserVisitor(iterator);

            root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;

            Assert.IsTrue(node.Token.Name == "Test");
            Assert.IsTrue(node.Children[0].Token.Name == "DynamicBackReferencing");
            Assert.IsTrue(node.Children[0].Children[0].Token.Name == "Label");
            Assert.IsTrue(node.Children[0].Children[0].Token.ValueAsString(iterator) == "CapturedLabelVariableName");
        }
 public override void VisitExecute(PrioritizedChoice expression)
 {
 }
        public void PracticalExample_BooleanAlgebra()
        {
            #region Composite

            //AND: */AND
            AExpression AND = new PrioritizedChoice(new Literal {
                MatchText = "*"
            }, new Literal {
                MatchText = "AND"
            });
            //NAND: ~*/NAND
            AExpression NAND = new PrioritizedChoice(new Literal {
                MatchText = "~*"
            }, new Literal {
                MatchText = "NAND"
            });


            //OR: +/OR
            AExpression OR = new PrioritizedChoice(new Literal {
                MatchText = "+"
            }, new Literal {
                MatchText = "OR"
            });
            //NOR: ~+/NOR
            AExpression NOR = new PrioritizedChoice(new Literal {
                MatchText = "~+"
            }, new Literal {
                MatchText = "NOR"
            });


            //XOR: ^/XOR
            AExpression XOR = new PrioritizedChoice(new Literal {
                MatchText = "^"
            }, new Literal {
                MatchText = "XOR"
            });
            //XNOR: ~^/XNOR
            AExpression XNOR = new PrioritizedChoice(new Literal {
                MatchText = "~^"
            }, new Literal {
                MatchText = "XNOR"
            });


            AExpression GATE = new CapturingGroup("GATE", new PrioritizedChoice(AND, NAND).Or(OR).Or(NOR).Or(XOR).Or(XNOR));


            // Variable: "[a-zA-Z0-9]+"  / '[a-zA-Z0-9]+' / [a-zA-Z]
            AExpression VARIABLE = new PrioritizedChoice(
                new Sequence(
                    new Literal {
                MatchText = "\""
            },
                    new CapturingGroup("VARIABLE", new OneOrMore(new CharacterClass {
                ClassExpression = "[a-zA-Z0-9]"
            }))
                    ).Sequence(new Literal {
                MatchText = "\""
            }),
                new Sequence(
                    new Literal {
                MatchText = "'"
            },
                    new CapturingGroup("VARIABLE", new OneOrMore(new CharacterClass {
                ClassExpression = "[a-zA-Z0-9]"
            }))
                    ).Sequence(new Literal {
                MatchText = "'"
            })
                ).Or(
                new CapturingGroup("VARIABLE", new CharacterClass {
                ClassExpression = "[a-zA-Z]"
            })
                );

            // Variable: Variable / !Variable
            VARIABLE = new PrioritizedChoice(
                VARIABLE
                ,
                new CapturingGroup("INVERTOR",
                                   new Sequence(
                                       new Literal {
                MatchText = "!"
            },
                                       VARIABLE
                                       )
                                   )
                );


            // Variable: Variable / Expression / !Expression
            VARIABLE = new PrioritizedChoice(
                VARIABLE
                ,
                new Sequence(
                    new Literal {
                MatchText = "("
            },
                    new RecursionCall("RECURSIONEXPRESSION")
                    ).Sequence(new Literal {
                MatchText = ")"
            })
                ).Or(
                new CapturingGroup("INVERTOR",
                                   new Sequence(
                                       new Literal {
                MatchText = "!"
            }
                                       ,
                                       new Sequence(
                                           new Literal {
                MatchText = "("
            },
                                           new RecursionCall("RECURSIONEXPRESSION")
                                           ).Sequence(new Literal {
                MatchText = ")"
            })
                                       )
                                   )
                );


            AExpression Root = new CapturingGroup("BOOLEANEQUATION",
                                                  new Sequence(
                                                      new RecursionCreate("RECURSIONEXPRESSION",
                                                                          //Expression: Variable ((AND|NAND|OR|NOR|XOR|XNOR) Variable)*
                                                                          new Sequence(VARIABLE, new Sequence(GATE, VARIABLE).Star())
                                                                          )
                                                      ,
                                                      // ensure reaches end of file
                                                      new NotPredicate(new AnyCharacter())
                                                      )
                                                  );

            #endregion

            // single variable
            var input    = "A*!B+!A*B";
            var bytes    = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;
            Assert.IsTrue(node.Token.Name == "BOOLEANEQUATION");
            Assert.IsTrue(node.Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[0].Token.ValueAsString(iterator) == "A");
            Assert.IsTrue(node.Children[1].Token.Name == "GATE");
            Assert.IsTrue(node.Children[1].Token.ValueAsString(iterator) == "*");
            Assert.IsTrue(node.Children[2].Token.Name == "INVERTOR");
            Assert.IsTrue(node.Children[2].Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[2].Children[0].Token.ValueAsString(iterator) == "B");
            Assert.IsTrue(node.Children[3].Token.Name == "GATE");
            Assert.IsTrue(node.Children[4].Token.Name == "INVERTOR");
            Assert.IsTrue(node.Children[4].Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[4].Children[0].Token.ValueAsString(iterator) == "A");
            Assert.IsTrue(node.Children[5].Token.Name == "GATE");
            Assert.IsTrue(node.Children[6].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[6].Token.ValueAsString(iterator) == "B");

            // quoted variable
            input    = "'aA'*!'bB'+!'aA'*'bB'";
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
            Assert.IsTrue(node.Token.Name == "BOOLEANEQUATION");
            Assert.IsTrue(node.Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[0].Token.ValueAsString(iterator) == "aA");
            Assert.IsTrue(node.Children[1].Token.Name == "GATE");
            Assert.IsTrue(node.Children[1].Token.ValueAsString(iterator) == "*");
            Assert.IsTrue(node.Children[2].Token.Name == "INVERTOR");
            Assert.IsTrue(node.Children[2].Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[2].Children[0].Token.ValueAsString(iterator) == "bB");
            Assert.IsTrue(node.Children[3].Token.Name == "GATE");
            Assert.IsTrue(node.Children[4].Token.Name == "INVERTOR");
            Assert.IsTrue(node.Children[4].Children[0].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[4].Children[0].Token.ValueAsString(iterator) == "aA");
            Assert.IsTrue(node.Children[5].Token.Name == "GATE");
            Assert.IsTrue(node.Children[6].Token.Name == "VARIABLE");
            Assert.IsTrue(node.Children[6].Token.ValueAsString(iterator) == "bB");


            // expression + gate + variable .star()
            input    = "A*!B*C+!A*B*C";
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning             Assert.IsTrue(node.Token.Value == input);

            // parethesis
            input    = "((A)*(!B)+(!A)*(B))";
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning            Assert.IsTrue(node.Token.Value == input);

            input    = "((A)*!(B)+!(A)*(B))";
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning            Assert.IsTrue(node.Token.Value == input);

            input    = "((A)*(!(B))+(!(A))*(B))";
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning            Assert.IsTrue(node.Token.Value == input);

            input    = ("(!X*Y*!Z)");
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning             Assert.IsTrue(node.Token.Value == input);

            input    = ("(!X*Y*!Z)+(!X*Y*Z)");
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning             Assert.IsTrue(node.Token.Value == input);

            input    = ("(X*Z)");
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning             Assert.IsTrue(node.Token.Value == input);

            input    = ("(!X*Y*!Z)+(!X*Y*Z)+(X*Z)");
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning            Assert.IsTrue(node.Token.Value == input);

            input    = ("((((!X*Y*Z)+(!X*Y*!Z)+(X*Z))))");
            bytes    = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor  = new NpegParserVisitor(iterator);
            Root.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
#warning            Assert.IsTrue(node.Token.Value == input);
        }
Esempio n. 16
0
 public abstract void VisitEnter(PrioritizedChoice expression);
 public override void VisitExecute(PrioritizedChoice expression)
 {
     terminal.Peek().Append(" / ");
 }
Esempio n. 18
0
 public abstract void VisitLeave(PrioritizedChoice expression);
 public override void VisitEnter(PrioritizedChoice expression)
 {
 }