static void Main(string[] args) { var expression = "1 + 2 - 3 * 4 / 5"; var lexer = new Lexer(new SourceScanner(expression)); Console.WriteLine($"Lexing expression: {expression}"); Token token = null; do { token = lexer.ReadNext( ); Console.WriteLine($"Found Token Type {token.Type} at Position {token.Position} with a value of {token.Value}"); } while(token.Type != Token.TokenType.EOE); var expressions = new string[] { "1 + 2", //3 "2 * 3", //5 "1 + 2 * 3", //7 "1", "1 / 2" }; var expressionEngine = new ExpressionEngine(); foreach (var e in expressions) { Console.WriteLine($"{e} = {expressionEngine.Evaluate( e )}"); } }
static void Main(string[] args) { var expression = "1 + 2 - 3 * 4 / 5"; var lexer = new Lexer(new SourceScanner(expression)); Console.WriteLine($"Lexing expression: {expression}"); Token token = null; do { token = lexer.ReadNext( ); Console.WriteLine($"Found Token Type {token.Type} at Position {token.Position} with a value of {token.Value}"); } while(token.Type != Token.TokenType.EOE); }
/// <summary> /// Parses the TERM Production Rule /// TERM: FACTOR [('*'|'/') FACTOR]* /// </summary> private static ASTNode ParseTerm(Lexer lexer) { var left = ParseFactor(lexer); var peekToken = lexer.Peek(); //look ahead 1 token while (peekToken.Type == Token.TokenType.Multiplication || peekToken.Type == Token.TokenType.Division) { var op = lexer.ReadNext( ); //read the operator var right = ParseFactor(lexer); if (right == null) { throw new Exception($"Invalid Expression. FACTOR Expected at position {lexer.Position}"); } left = CreateBinaryOperator(op, left, right); peekToken = lexer.Peek( ); //lookahead of 1 token LL(k) where K = 1 } return(left); }
private Token Accept( ) => _lexer.ReadNext( );