#include "Lexer.h" #include "Parser.h" #include #include #include static llvm::cl::opt inputFilename(llvm::cl::Positional, llvm::cl::desc(""), llvm::cl::init("-"), llvm::cl::value_desc("filename")); namespace { enum Action { None, DumpSyntaxNode }; } static llvm::cl::opt emitAction("emit", llvm::cl::desc("Select the kind of output desired"), llvm::cl::values(clEnumValN(DumpSyntaxNode, "ast", "Dump syntax node"))); std::unique_ptr parseInputFile(llvm::StringRef filename) { llvm::ErrorOr> fileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filename); if (std::error_code ec = fileOrErr.getError()) { llvm::errs() << "Could not open input file: " << ec.message() << "\n"; return nullptr; } auto buffer = fileOrErr.get()->getBuffer(); hello::LexerBuffer lexer(buffer.begin(), buffer.end(), std::string(filename)); hello::Parser parser(lexer); return parser.parseModule(); } int main(int argc, char** argv) { llvm::cl::ParseCommandLineOptions(argc, argv, "Hello MLIR Compiler\n"); auto module = parseInputFile(inputFilename); if (!module) { return 1; } switch (emitAction) { case DumpSyntaxNode: module->dump(); return 0; default: llvm::errs() << "Unrecognized action\n"; return 1; } }