mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-27 16:50:10 +01:00
Example stack:
```
1. node_stack_:
0. FunctionDefinitionStart
1. ReturnStatement -> node1
2. node_block_stack_:
0. block0
1. block1
```
Example trace output:
```
*** SemanticsParseTreeHandler::Build Begin ***
Push 0: FunctionIntroducer
Push 1: DeclaredName
Push 2: ParameterListEnd
Pop 2: ParameterListEnd
Push 2: ParameterList
Pop 2: ParameterList
Pop 0: FunctionIntroducer
AddNode block0: FunctionDeclaration()
AddNode block0: BindName(ident0, node0)
AddNode block0: FunctionDefinition(node0, block1)
Push 0: FunctionDefinitionStart
Push 1: Literal -> IntegerLiteral
AddNode block1: IntegerLiteral(int0): node_xref1
Push 2: StatementEnd
Pop 2: StatementEnd
Pop 1: any (Literal) -> node0
Push 1: ReturnStatement -> ReturnExpression
AddNode block1: ReturnExpression(node0)
Pop 0: FunctionDefinitionStart
Push 0: FunctionDefinition
*** SemanticsParseTreeHandler::Build End ***
cross_reference_irs.size == 2,
cross_references = {
node_xref0 = "xref(ir0, block0, node0)";
node_xref1 = "xref(ir0, block0, node1)";
},
identifiers = {
ident0 = "Foo";
},
integer_literals = {
int0 = 0;
},
node_blocks = {
block0 = {
node0 = FunctionDeclaration();
node1 = BindName(ident0, node0);
node2 = FunctionDefinition(node0, block1);
},
block1 = {
node0 = IntegerLiteral(int0): node_xref1;
node1 = ReturnExpression(node0);
},
}
```
Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
76 lines
2.9 KiB
C++
76 lines
2.9 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#ifndef CARBON_TOOLCHAIN_DRIVER_DRIVER_H_
|
|
#define CARBON_TOOLCHAIN_DRIVER_DRIVER_H_
|
|
|
|
#include <cstdint>
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "toolchain/diagnostics/diagnostic_emitter.h"
|
|
|
|
namespace Carbon {
|
|
|
|
// Command line interface driver.
|
|
//
|
|
// Provides simple API to parse and run command lines for Carbon. It is
|
|
// generally expected to be used to implement command line tools for working
|
|
// with the language.
|
|
class Driver {
|
|
public:
|
|
// Default constructed driver uses stderr for all error and informational
|
|
// output.
|
|
Driver() : output_stream_(llvm::outs()), error_stream_(llvm::errs()) {}
|
|
|
|
// Constructs a driver with any error or informational output directed to a
|
|
// specified stream.
|
|
Driver(llvm::raw_ostream& output_stream, llvm::raw_ostream& error_stream)
|
|
: output_stream_(output_stream), error_stream_(error_stream) {}
|
|
|
|
// Parses the given arguments into both a subcommand to select the operation
|
|
// to perform and any arguments to that subcommand.
|
|
//
|
|
// Returns true if the operation succeeds. If the operation fails, returns
|
|
// false and any information about the failure is printed to the registered
|
|
// error stream (stderr by default).
|
|
auto RunFullCommand(llvm::ArrayRef<llvm::StringRef> args) -> bool;
|
|
|
|
// Subcommand that prints available help text to the error stream.
|
|
//
|
|
// Optionally one positional parameter may be provided to select a particular
|
|
// subcommand or detailed section of help to print.
|
|
//
|
|
// Returns true if appropriate help text was found and printed. If an invalid
|
|
// positional parameter (or flag) is provided, returns false.
|
|
auto RunHelpSubcommand(DiagnosticConsumer& consumer,
|
|
llvm::ArrayRef<llvm::StringRef> args) -> bool;
|
|
|
|
// Subcommand that dumps internal compilation information for the provided
|
|
// source file.
|
|
//
|
|
// Requires exactly one positional parameter to designate the source file to
|
|
// read. May be `-` to read from stdin.
|
|
//
|
|
// Returns true if the operation succeeds. If the operation fails, this
|
|
// returns false and any information about the failure is printed to the
|
|
// registered error stream (stderr by default).
|
|
auto RunDumpSubcommand(DiagnosticConsumer& consumer,
|
|
llvm::ArrayRef<llvm::StringRef> args) -> bool;
|
|
|
|
private:
|
|
auto ReportExtraArgs(llvm::StringRef subcommand_text,
|
|
llvm::ArrayRef<llvm::StringRef> args) -> void;
|
|
|
|
llvm::raw_ostream& output_stream_;
|
|
llvm::raw_ostream& error_stream_;
|
|
llvm::raw_ostream* vlog_stream_ = nullptr;
|
|
};
|
|
|
|
} // namespace Carbon
|
|
|
|
#endif // CARBON_TOOLCHAIN_DRIVER_DRIVER_H_
|