mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 14:11:04 +01:00
Replaced std::exit() with return Carbon::ErrorOr for expected errors like invalid syntax (#1120)
* Replaced std::exit() with return llvm::Expected/llvm::Error<T> for expected errors like invalid syntax. * Use llvm::formatv() for formatting lexer error messages. x * Addresed merge errors. * Fixed impl scope. * Made ErrorBuilder::operator<< nodiscard, to catch code forgetting 'return' in 'return FATAL_COMPILATION_ERROR()'. * FatalComplationError() -> ParseAndLexContext::RecordLexerError(). Other usages of ERROR_TOKEN in lexer.lpp were actually supposed to be END_OF_FILE. * Update executable_semantics/syntax/parse_and_lex_context.h Co-authored-by: Jon Meow <jperkins@google.com> * Code review fixes. * Update executable_semantics/syntax/parser.ypp Co-authored-by: Jon Meow <jperkins@google.com> * More code review fixes. * Update executable_semantics/interpreter/type_checker.h Co-authored-by: Jon Meow <jperkins@google.com> * Yet more code review fixes... * Update executable_semantics/syntax/lexer.lpp Co-authored-by: Jon Meow <jperkins@google.com> * code review comments * Update executable_semantics/interpreter/interpreter.cpp Co-authored-by: Geoff Romer <gromer@google.com> * Apply suggestions from code review Co-authored-by: Jon Meow <jperkins@google.com> * Update executable_semantics/syntax/lexer.lpp Co-authored-by: Jon Meow <jperkins@google.com> * code review * code review * Apply suggestions from code review Co-authored-by: Jon Meow <jperkins@google.com> * formatted code * review comments * Switched to the new ErrorOr<V> error implementation * code review comments * fixed comment * restored ostream.h as #976 makes the change unnecesary * review comments Co-authored-by: Jon Meow <jperkins@google.com> Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
committed by
GitHub
co-authored by
Jon Meow
Geoff Romer
parent
e5a87af6fe
commit
aa8a5f174d
@@ -62,6 +62,7 @@
|
||||
#include "common/check.h"
|
||||
#include "executable_semantics/syntax/parse_and_lex_context.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
} // %code top
|
||||
|
||||
%code requires {
|
||||
@@ -86,13 +87,13 @@
|
||||
|
||||
%code {
|
||||
void Carbon::Parser::error(const location_type&, const std::string& message) {
|
||||
context.PrintDiagnostic(message);
|
||||
context.RecordSyntaxError(message);
|
||||
}
|
||||
} // %code
|
||||
|
||||
%token <int> integer_literal
|
||||
%token <std::string> identifier
|
||||
%token <std::string> intrinsic_identifier
|
||||
%token <IntrinsicExpression::Intrinsic> intrinsic_identifier
|
||||
%token <std::string> sized_type_literal
|
||||
%token <std::string> string_literal
|
||||
%type <std::string> designator
|
||||
@@ -582,7 +583,16 @@ non_expression_pattern:
|
||||
| paren_pattern
|
||||
{ $$ = $1; }
|
||||
| postfix_expression tuple_pattern
|
||||
{ $$ = arena->New<AlternativePattern>(context.source_loc(), $1, $2); }
|
||||
{
|
||||
ErrorOr<Nonnull<AlternativePattern*>> alternative_pattern =
|
||||
AlternativePattern::Create(arena, context.source_loc(), $1, $2);
|
||||
if (alternative_pattern.ok()) {
|
||||
$$ = *alternative_pattern;
|
||||
} else {
|
||||
context.RecordSyntaxError(alternative_pattern.error().message());
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
| VAR non_expression_pattern
|
||||
{ $$ = arena->New<VarPattern>(context.source_loc(), $2); }
|
||||
;
|
||||
@@ -804,13 +814,25 @@ receiver:
|
||||
function_declaration:
|
||||
FN identifier deduced_params receiver maybe_empty_tuple_pattern return_term block
|
||||
{
|
||||
$$ = arena->New<FunctionDeclaration>(context.source_loc(), $2, $3, $4, $5,
|
||||
$6, $7);
|
||||
ErrorOr<FunctionDeclaration*> fn = FunctionDeclaration::Create(
|
||||
arena, context.source_loc(), $2, $3, $4, $5, $6, $7);
|
||||
if (fn.ok()) {
|
||||
$$ = *fn;
|
||||
} else {
|
||||
context.RecordSyntaxError(fn.error().message());
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
| FN identifier deduced_params receiver maybe_empty_tuple_pattern return_term SEMICOLON
|
||||
{
|
||||
$$ = arena->New<FunctionDeclaration>(context.source_loc(), $2, $3, $4, $5,
|
||||
$6, std::nullopt);
|
||||
ErrorOr<FunctionDeclaration*> fn = FunctionDeclaration::Create(
|
||||
arena, context.source_loc(), $2, $3, $4, $5, $6, std::nullopt);
|
||||
if (fn.ok()) {
|
||||
$$ = *fn;
|
||||
} else {
|
||||
context.RecordSyntaxError(fn.error().message());
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
;
|
||||
variable_declaration: identifier COLON pattern
|
||||
|
||||
Reference in New Issue
Block a user