Example #1
0
        public void DesconsideraCaracteres_Conforme_IgnoreDelegate()
        {
            /*
             * A IDEIA BASICA SOBRE IGNORAR:
             * -----------------------------
             * > O token é que determina se vai ou não ignorar
             *   algo antes iniciar o consumo de seus caracteres.
             *
             * > Pra isso, além de receber o TokenExtractor, ele
             *   precisa receber o [ignorer]
             *
             * > Normalmente o ignorar é feito no início do processo,
             *   logo antes de consumir o primeiro [char]
             *
             *   # Imagine um "ignorar espaços vazios [espaço, tab, nova linha, etc],
             *   # Agora imagine os tokens de:
             *      - Comentário de única linha -> // comentário aqui
             *      - Comentário de várias linhas -> (* várias linhas *)
             *      - Strings -> "uma   string   qualquer"
             *   # Esses devem ignorar os caracteres iniciais, mas uma vez
             *     que estão dentro de seu escopo, devem considerar os "espaços vazios"
             *
             * > Imaginamos que o elemento [CharGrammarElement] não faz mais
             *   sentido aqui. Talvez um [WordGrammarElement] faça mais sentido.
             *   Se será uma palavra de um único caractere ele é que determina
             */

            bool ignore(char c) => new[] { ' ', '*', '-' }.Contains(c);

            var ABRoot = new AndListGrammarElement(new[] {
                new CharGrammarElement('A'),
                new CharGrammarElement('B')
            });

            var grammar = new Grammar(ABRoot, ignore);
            var parser  = new Parser(grammar);

            var code = TokenExtractor.FromString(
                "- - * A - - --- ******  B **    -----"
                );

            var tree = parser.Parse(code);

            Assert.NotNull(tree);
            Assert.NotNull(tree.RootNode);
            Assert.NotNull(tree.RootNode.Token);
            Assert.NotNull(tree.RootNode.Token.Content);
            Assert.True(tree.IsValid);
            Assert.IsType <Token[]>(tree.RootNode.Token.Content);
            Assert.Equal(2, (tree.RootNode.Token.Content as Token[]).Length);
            Assert.Equal("A", ((tree.RootNode.Token.Content as Token[])[0] as Token).Content.ToString());
            Assert.Equal("B", ((tree.RootNode.Token.Content as Token[])[1] as Token).Content.ToString());
        }
Example #2
0
        public void Reconhece_ListaValida_AoAvaliar()
        {
            var list = new[]
            {
                new CharGrammarElement('a'),
                new CharGrammarElement('b'),
                new CharGrammarElement('c')
            };

            var grammar   = new AndListGrammarElement(list);
            var extractor = TokenExtractor.FromString("abc");
            var token     = grammar.Eval(extractor);

            Assert.NotNull(token);
            Assert.IsType <Token[]>(token.Content);
            Assert.Equal(3, (token.Content as Token[]).Length);
            Assert.Equal("a", (token.Content as Token[])[0].Content.ToString());
            Assert.Equal("b", (token.Content as Token[])[1].Content.ToString());
            Assert.Equal("c", (token.Content as Token[])[2].Content.ToString());
        }
Example #3
0
        public void Consome_SoOsCaracteres_Necessarios()
        {
            var list = new[]
            {
                new CharGrammarElement('e'),
                new CharGrammarElement('f'),
                new CharGrammarElement('g')
            };

            var grammar   = new AndListGrammarElement(list);
            var extractor = TokenExtractor.FromString("efghhh");
            var posBegin  = extractor.SaveCursor();
            var token     = grammar.Eval(extractor);

            Assert.NotNull(token);
            Assert.Equal(0, posBegin.Position);
            Assert.Equal(3, extractor.SaveCursor().Position);

            Assert.IsType <Token[]>(token.Content);
            Assert.Equal(3, (token.Content as Token[]).Length);
            Assert.Equal("e", (token.Content as Token[])[0].Content.ToString());
            Assert.Equal("f", (token.Content as Token[])[1].Content.ToString());
            Assert.Equal("g", (token.Content as Token[])[2].Content.ToString());
        }