Skip to content

erlimar/my-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

my-parser

Parser de qualquer coisa

Exemplo de uso

class CalcSample
{
    void Main()
    {
        var grammar = new CalcTwoNumbersGrammar();
        var inputCode = "437 + 734";

        var compiler = new MyCompiler<CalcTwoNumbersObject>(
            grammar,
            CalcTwoNumbersObject.Emitter
        );

        var calc = compiler.Compile(inputCode);
        var result = calc.CalcNumbers();

        Assert.Equal(1171, result);
    }
}

Definição da gramática:

public class CalcTwoNumbersGrammar : MyGrammar
{
    public CalcTwoNumbersGrammar()
    {
        RootElement = new GrammarElements.SumExpressionGrammarElement();
        OnLexerDiscard = DoLexerDiscard;
    }

    private bool DoLexerDiscard(Char element)
    {
        var ignorableChars = new char[]
        {
            '\n',
            '\r',
            '\t',
            ' '
        };

        return ignorableChars.Contains(element);
    }
}

Classes gramaticais:

public enum CalcTwoNumbersTokenClass
{
    SUM_EXPRESSION,
    NUM,
    PLUS
}

Elementos gramaticais:

public class SumExpressionGrammarElement : Grammar.CommonElements.GroupAndGrammarElement
{
    private static MyGrammarElement[] ExpressionElements = new MyGrammarElement[]
    {
        new NumberGrammarElement(),
        new PlusGrammarElement(),
        new NumberGrammarElement()
    };

    public SumExpressionGrammarElement()
        : base(ExpressionElements)
    { }

    public override object GetTokenClass()
    {
        return CalcTwoNumbersTokenClass.SUM_EXPRESSION;
    }

    public override SyntaxTreeNode Make(ObjectStream<MyToken> input, MyDiscardDelegate<MyToken> discarder)
    {
        /* Código de construção do nó sintático */
    }
}

public class NumberGrammarElement : Grammar.CommonElements.NumberGrammarElement
{
    public override object GetTokenClass()
    {
        return CalcTwoNumbersTokenClass.NUM;
    }
}

public class PlusGrammarElement : Grammar.CommonElements.CharacterGrammarElement
{
    public PlusGrammarElement()
        : base('+')
    { }

    public override object GetTokenClass()
    {
        return CalcTwoNumbersTokenClass.PLUS;
    }
}

About

Parser de qualquer coisa

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages