Skip to content

Commit

Permalink
Make --new-parser flag work
Browse files Browse the repository at this point in the history
  • Loading branch information
Thirumalai-Shaktivel authored and certik committed Apr 8, 2022
1 parent bb94bd9 commit 8d34984
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 18 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ src/lpython/tests/cmp32
src/lpython/tests/x
src/lpython/tests/ref_pickle.txt.new
src/lpython/parser/tokenizer.cpp
src/lpython/parser/parser.output
src/lpython/parser/parser.tab.cc
src/lpython/parser/parser.tab.hh

## CMake
CMakeCache.txt
Expand Down
35 changes: 21 additions & 14 deletions src/bin/lpython.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,17 @@ int emit_ast(const std::string &infile,
CompilerOptions &compiler_options)
{
Allocator al(4*1024);
LFortran::diag::Diagnostics diagnostics;
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
al, runtime_library_dir, infile, compiler_options.new_parser);
al, runtime_library_dir, infile, diagnostics, compiler_options.new_parser);
if (!r.ok) {
return 1;
}
LFortran::LPython::AST::ast_t* ast = r.result;

if (compiler_options.tree) {
std::cout << LFortran::LPython::pickle_tree_python(*ast, compiler_options.use_colors) << std::endl;
std::cout << LFortran::LPython::pickle_tree_python(*ast,
compiler_options.use_colors) << std::endl;
} else {
std::cout << LFortran::LPython::pickle_python(*ast,
compiler_options.use_colors, compiler_options.indent) << std::endl;
Expand All @@ -138,18 +140,19 @@ int emit_asr(const std::string &infile,
bool with_intrinsic_modules, CompilerOptions &compiler_options)
{
Allocator al(4*1024);
LFortran::diag::Diagnostics diagnostics;
LFortran::Result<LFortran::LPython::AST::ast_t*> r1 = parse_python_file(
al, runtime_library_dir, infile);
al, runtime_library_dir, infile, diagnostics, false);
if (!r1.ok) {
return 1;
}
LFortran::LPython::AST::ast_t* ast = r1.result;

LFortran::LocationManager lm;
lm.in_filename = infile;
std::string input = read_file(infile);
std::string input = LFortran::read_file(infile);
lm.init_simple(input);
LFortran::diag::Diagnostics diagnostics;
diagnostics.diagnostics.clear();
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
r = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, true,
compiler_options.symtab_only);
Expand All @@ -175,18 +178,19 @@ int emit_cpp(const std::string &infile,
CompilerOptions &compiler_options)
{
Allocator al(4*1024);
LFortran::diag::Diagnostics diagnostics;
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
al, runtime_library_dir, infile);
al, runtime_library_dir, infile, diagnostics, false);
if (!r.ok) {
return 1;
}
LFortran::LPython::AST::ast_t* ast = r.result;

LFortran::LocationManager lm;
lm.in_filename = infile;
std::string input = read_file(infile);
std::string input = LFortran::read_file(infile);
lm.init_simple(input);
LFortran::diag::Diagnostics diagnostics;
diagnostics.diagnostics.clear();
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, true,
compiler_options.symtab_only);
Expand Down Expand Up @@ -215,8 +219,9 @@ int emit_llvm(const std::string &infile,
CompilerOptions &compiler_options)
{
Allocator al(4*1024);
LFortran::diag::Diagnostics diagnostics;
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
al, runtime_library_dir, infile);
al, runtime_library_dir, infile, diagnostics, false);
if (!r.ok) {
return 1;
}
Expand All @@ -225,9 +230,9 @@ int emit_llvm(const std::string &infile,
// Src -> AST -> ASR
LFortran::LPython::AST::ast_t* ast = r.result;
lm.in_filename = infile;
std::string input = read_file(infile);
std::string input = LFortran::read_file(infile);
lm.init_simple(input);
LFortran::diag::Diagnostics diagnostics;
diagnostics.diagnostics.clear();
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, true,
compiler_options.symtab_only);
Expand Down Expand Up @@ -259,8 +264,9 @@ int compile_python_to_object_file(
CompilerOptions &compiler_options)
{
Allocator al(4*1024);
LFortran::diag::Diagnostics diagnostics;
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
al, runtime_library_dir, infile);
al, runtime_library_dir, infile, diagnostics, false);
if (!r.ok) {
return 1;
}
Expand All @@ -269,9 +275,9 @@ int compile_python_to_object_file(
// Src -> AST -> ASR
LFortran::LPython::AST::ast_t* ast = r.result;
lm.in_filename = infile;
std::string input = read_file(infile);
std::string input = LFortran::read_file(infile);
lm.init_simple(input);
LFortran::diag::Diagnostics diagnostics;
diagnostics.diagnostics.clear();
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, true,
compiler_options.symtab_only);
Expand Down Expand Up @@ -542,6 +548,7 @@ int main(int argc, char *argv[])
// LPython specific options
app.add_flag("--cpp", compiler_options.c_preprocessor, "Enable C preprocessing");
app.add_flag("--show-tokens", show_tokens, "Show tokens for the given python file and exit");
app.add_flag("--new-parser", compiler_options.new_parser, "Use lpython parser");
app.add_flag("--show-ast", show_ast, "Show AST for the given python file and exit");
app.add_flag("--show-asr", show_asr, "Show ASR for the given python file and exit");
app.add_flag("--show-llvm", show_llvm, "Show LLVM IR for the given file and exit");
Expand Down
8 changes: 5 additions & 3 deletions src/lpython/parser/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,18 @@ void Parser::handle_yyerror(const Location &loc, const std::string &msg)

Result<LPython::AST::ast_t*> parse_python_file(Allocator &al,
const std::string &runtime_library_dir,
const std::string &infile, diag::Diagnostics &diagnostics,
const std::string &infile,
diag::Diagnostics &diagnostics,
bool new_parser) {
LPython::AST::ast_t* ast;
if (new_parser) {
std::string input = read_file(infile);
Result<LPython::AST::Module_t*> res = parse(
al, input, diagnostics);
Result<LPython::AST::Module_t*> res = parse(al, input, diagnostics);
LocationManager lm;
lm.in_filename = infile;
lm.init_simple(input);
CompilerOptions compiler_options;
std::cerr << diagnostics.render(input, lm, compiler_options);
if (res.ok) {
ast = (LPython::AST::ast_t*)res.result;
} else {
Expand Down
3 changes: 2 additions & 1 deletion src/lpython/parser/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ Result<LPython::AST::Module_t*> parse(Allocator &al,

Result<LPython::AST::ast_t*> parse_python_file(Allocator &al,
const std::string &runtime_library_dir,
const std::string &infile, diag::Diagnostics &diagnostics,
const std::string &infile,
diag::Diagnostics &diagnostics,
bool new_parser);

} // namespace LFortran
Expand Down

0 comments on commit 8d34984

Please sign in to comment.