#include #include #include #include #include #include #include #include #include #include #include #include #include //////////////////////////////////////////////////////////////////////////////////////////////////// // // Command Check Syntax // //////////////////////////////////////////////////////////////////////////////////////////////////// int CommandCheckSyntax::run(int argc, char **argv) { parseOptions(argc, argv); const auto &basicOptions = std::get(m_optionGroups); const auto &outputOptions = std::get(m_optionGroups); const auto &parserOptions = std::get(m_optionGroups); if (basicOptions.help) { printHelp(); return EXIT_SUCCESS; } if (basicOptions.version) { printVersion(); return EXIT_SUCCESS; } colorlog::Logger logger; logger.setColorPolicy(outputOptions.colorPolicy); logger.setLogPriority(outputOptions.logPriority); if (basicOptions.warningsAsErrors) logger.setAbortPriority(colorlog::Priority::Warning); const auto printCompatibilityInfo = [&]() { if (parserOptions.parsingMode != pddl::Mode::Compatibility) logger.log(colorlog::Priority::Info, "try using --parsing-mode=compatibility for extended legacy feature support"); }; try { tokenize::Tokenizer tokenizer; if (!parserOptions.inputFiles.empty()) std::for_each(parserOptions.inputFiles.cbegin(), parserOptions.inputFiles.cend(), [&](const auto &inputFile) { tokenizer.read(inputFile); }); else { logger.log(colorlog::Priority::Info, "reading from stdin"); tokenizer.read("std::cin", std::cin); } const auto detectLanguage = [&]() { if (parserOptions.language == plasp::Language::Type::Automatic) return plasp::detectLanguage(tokenizer); return parserOptions.language; }; switch (detectLanguage()) { case plasp::Language::Type::Automatic: case plasp::Language::Type::Unknown: { logger.log(colorlog::Priority::Error, "unknown input language"); std::cout << std::endl; printHelp(); return EXIT_FAILURE; } // TODO: get rid of unknown language type, use exception instead case plasp::Language::Type::PDDL: { const auto logWarning = [&](const auto &location, const auto &warning) { logger.log(colorlog::Priority::Warning, location, warning); }; auto context = pddl::Context(std::move(tokenizer), logWarning); context.mode = parserOptions.parsingMode; auto description = pddl::parseDescription(context); logger.log(colorlog::Priority::Info, "no syntax errors found"); return EXIT_SUCCESS; } case plasp::Language::Type::SAS: { logger.log(colorlog::Priority::Error, "Syntax checking is only supported for PDDL specifications"); return EXIT_FAILURE; } } } catch (const tokenize::TokenizerException &e) { logger.log(colorlog::Priority::Error, e.location(), e.message().c_str()); printCompatibilityInfo(); return EXIT_FAILURE; } catch (const pddl::ParserException &e) { if (e.location()) logger.log(colorlog::Priority::Error, e.location().value(), e.message().c_str()); else logger.log(colorlog::Priority::Error, e.message().c_str()); printCompatibilityInfo(); return EXIT_FAILURE; } catch (const std::exception &e) { logger.log(colorlog::Priority::Error, e.what()); return EXIT_FAILURE; } return EXIT_SUCCESS; }