private ast.IStatement CompleteStatement(ast.IExpression expression) { if (expression == null) // there was a parse error in the expression { RecoverUntilPunctuationTokenAndConsume(";"); return null; } else if (Input.NextTokenIs<OperatorToken>("=")) { return MakeAssignmentStatement(expression); } else if (expression is ast.MethodInvocation) { Input.MatchAndConsume<PunctuationToken>(";"); return (ast.MethodInvocation)expression; } else { var expr = (ast.SyntaxElement)expression; throw new SyntaxError(String.Format("Expression of type {0} cannot form a statement on its own.", expression.Describe()), expr.Row, expr.Col); } }
private ast.VariableDeclaration VariableOrFormalParameterDeclaration(ast.VariableDeclaration.Kind kind, params string[] followSet) { try { var typeInfo = Type(); var type = typeInfo.typeToken; var variableIdent = Input.MatchAndConsume<IdentifierToken>(); return new ast.VariableDeclaration(variableIdent.Lexeme, type.Lexeme, typeInfo.isArray, kind, type.Row, type.Col); } catch (SyntaxError e) { if (DebugMode) throw; ErrorReporter.ReportError(ErrorTypes.Syntax, e.Message, e.Row, e.Col); } catch (LexicalError) { if (DebugMode) throw; } ParsingFailed = true; RecoverFromVariableDeclarationMatching(followSet); return null; }
public bool TryParse(out ast.Program program) { program = Program(); return !ParsingFailed; }
private ast.VariableDeclaration VariableDeclaration(ast.VariableDeclaration.Kind kind) { var variableDecl = VariableOrFormalParameterDeclaration(kind, ";"); Input.MatchAndConsume<PunctuationToken>(";"); return variableDecl; }
private ast.IStatement MakeAssignmentStatement(ast.IExpression lhs) { var assignment = Input.MatchAndConsume<OperatorToken>("="); ast.IExpression rhs = Expression(); Input.MatchAndConsume<PunctuationToken>(";"); return new ast.AssignmentStatement(lhs, rhs, assignment.Row, assignment.Col); }