private AST ParseAssignment(AST node) { while (_lexer.CurrentToken.Type == TokenType.Assign) { if (node.GetType() == typeof(FnCallAST)) { throw new Exception($"Syntax error - function {node.Value} cannot be assigned to"); } _lexer.AcceptToken(TokenType.Assign); var expr = ParseExpr(); node = new BinaryOpAST(node, "=", expr); } return(node); }
private AST ParseTerm(List <string> ns) { // term ::= factor | (*\/|%) factor var factor = ParseFactor(ns); var token = _lexer.CurrentToken; while (token.Type == TokenType.Mul || token.Type == TokenType.Div || token.Type == TokenType.Mod) { _lexer.AcceptToken(token.Type); var otherFactor = ParseFactor(ns); factor = new BinaryOpAST(factor, token.Value, otherFactor); token = _lexer.CurrentToken; } return(factor); }
private AST ParseExpr(List <string> ns = null) { // expr ::= term | (+\-) factor var term = ParseTerm(ns); var token = _lexer.CurrentToken; while (token.Type == TokenType.Add || token.Type == TokenType.Sub) { _lexer.AcceptToken(token.Type); var otherTerm = ParseTerm(ns); term = new BinaryOpAST(term, token.Value, otherTerm); token = _lexer.CurrentToken; } return(term); }