42int main (
int argc,
char *argv[])
44 QCoreApplication app (argc, argv);
46 bool generate_dot =
false;
47 bool generate_report =
false;
48 bool no_lines =
false;
49 bool debug_info =
true;
50 bool use_pragma_once =
false;
52 bool qt_copyright =
false;
53 bool warnings_are_errors =
false;
56 const QStringList args = app.arguments().mid(1);
57 for (
const QString &arg : args) {
58 if (arg ==
"-h"_L1 || arg ==
"--help"_L1)
61 else if (arg ==
"-v"_L1 || arg ==
"--verbose"_L1)
62 generate_report =
true;
64 else if (arg ==
"--dot"_L1)
67 else if (arg ==
"--no-lines"_L1)
70 else if (arg ==
"--no-debug"_L1)
73 else if (arg ==
"--use-pragma-once"_L1)
74 use_pragma_once =
true;
76 else if (
constexpr auto qtsec =
"--qt-security="_L1; arg.startsWith(qtsec))
78 auto sh = CppGenerator::SecurityHeader::parse(QStringView{arg}.slice(qtsec.size()));
80 qerr() <<
"*** Warning. Could not parse `" << arg <<
"'" << Qt::endl;
82 security = std::move(sh);
85 else if (arg ==
"--qt"_L1)
88 else if (arg ==
"--exit-on-warn"_L1)
89 warnings_are_errors =
true;
91 else if (file_name.isEmpty ())
95 qerr() <<
"*** Warning. Ignore argument `" << arg <<
"'" << Qt::endl;
98 if (file_name.isEmpty ())
105 Recognizer p (&grammar, no_lines);
107 if (! p.parse (file_name))
110 if (grammar
.rules.empty())
112 qerr() <<
"*** Fatal. No rules!" << Qt::endl;
116 else if (grammar
.start == grammar.names.end ())
118 qerr() <<
"*** Fatal. No start symbol!" << Qt::endl;
143 else if (generate_report)
152QString Recognizer::expand (
const QString &text)
const
156 if (_M_grammar
->start != _M_grammar->names.end ())
158 code = code.replace (
"$start_id"_L1, QString::number (std::distance (_M_grammar->names.begin (), _M_grammar->start)));
159 code = code.replace (
"$start"_L1, *_M_grammar
->start);
162 code = code.replace (
"$header"_L1, _M_grammar->table_name.toLower () +
"_p.h"_L1);
164 code = code.replace (
"$table"_L1, _M_grammar->table_name);
165 code = code.replace (
"$parser"_L1, _M_grammar->table_name);
167 if (_M_current_rule != _M_grammar
->rules.end ())
169 code = code.replace (
"$rule_number"_L1, QString::number (std::distance (_M_grammar->rules.begin (), _M_current_rule)));
170 code = code.replace (
"$rule"_L1, *_M_current_rule->lhs);