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()); }
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()); }
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()); }