예제 #1
0
 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);
     }
 }
예제 #2
0
 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;
 }
예제 #3
0
 public bool TryParse(out ast.Program program)
 {
     program = Program();
     return !ParsingFailed;
 }
예제 #4
0
 private ast.VariableDeclaration VariableDeclaration(ast.VariableDeclaration.Kind kind)
 {
     var variableDecl = VariableOrFormalParameterDeclaration(kind, ";");
     Input.MatchAndConsume<PunctuationToken>(";");
     return variableDecl;
 }
예제 #5
0
 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);
 }