12 #include <hilti/compiler/context.h> 14 #include <spicy/ast/aliases.h> 15 #include <spicy/ast/types/unit.h> 16 #include <spicy/compiler/detail/codegen/production.h> 31 struct ProductionVisitor;
38 enum class LiteralMode {
51 {LiteralMode::Try,
"try"}};
54 constexpr
auto to_string(LiteralMode cc) {
return hilti::util::enum_::to_string(cc, detail::literal_modes); }
56 namespace look_ahead {
66 extern const hilti::Expression None;
72 extern const hilti::Expression Eod;
99 void printDebug(
const std::shared_ptr<hilti::builder::Builder>& b)
const;
102 std::reference_wrapper<const type::Unit>
unit;
120 std::optional<Expression> ncur;
132 Expression lahead = look_ahead::None;
141 LiteralMode literal_mode = LiteralMode::Default;
176 Expression parseMethodExternalOverload1(
const type::Unit& t);
184 Expression parseMethodExternalOverload2(
const type::Unit& t);
193 Expression parseMethodExternalOverload3(
const type::Unit& t);
200 Expression contextNewFunction(
const type::Unit& t);
214 _builders.emplace_back(b);
219 std::shared_ptr<hilti::builder::Builder> pushBuilder();
223 auto x = _builders.back();
224 _builders.pop_back();
246 auto pushBuilder(std::shared_ptr<hilti::builder::Builder> b,
const std::function<
void()>& func) {
254 Expression parseType(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst);
257 Expression parseTypeTry(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst);
260 hilti::type::Function parseMethodFunctionType(std::optional<type::function::Parameter> addl_param = {},
272 Expression parseLiteral(
const Production& p,
const std::optional<Expression>& dst);
285 void waitForInput(
const Expression& min,
const std::string& error_msg,
const Meta&
location);
298 Expression waitForInputOrEod(
const Expression& min);
307 void waitForInput(
const std::string& error_msg,
const Meta& location);
317 Expression waitForInputOrEod();
335 void advanceInput(
const Expression& i);
342 void setInput(
const Expression& i);
349 void saveParsePosition();
364 void consumeLookAhead(std::optional<Expression> dst = {});
367 void parseError(
const std::string& error_msg,
const Meta& location);
370 void parseError(
const Expression& error_msg,
const Meta& location);
373 void parseError(
const std::string& fmt, std::vector<Expression> args,
const Meta& location);
376 void newValueForField(
const production::Meta& meta,
const Expression& value,
const Expression& dd);
394 Expression newContainerItem(
const type::unit::item::Field& field,
const Expression&
self,
const Expression& item,
405 std::optional<Expression> dst = {});
414 void trimInput(
bool force =
false);
422 void initializeUnit(
const Location& l);
431 void finalizeUnit(
bool success,
const Location& l);
434 void initBacktracking();
437 void finishBacktracking();
445 Expression initLoopBody();
455 void finishLoopBody(
const Expression& cookie,
const Location& l);
466 void guardFeatureCode(
const type::Unit& unit, std::string_view feature, std::function<
void()> f);
468 CodeGen* cg()
const {
return _cg; }
469 std::shared_ptr<hilti::Context> context()
const;
476 Expression _parseType(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst,
479 std::vector<ParserState> _states;
480 std::vector<std::shared_ptr<hilti::builder::Builder>> _builders;
481 std::map<ID, Expression> _functions;
482 bool _report_new_value_for_field =
true;
Definition: function.h:71
void enableDefaultNewValueForField(bool enable)
Definition: parser-builder.h:382
auto builder()
Definition: parser-builder.h:210
bool isEnabledDefaultNewValueForField()
Definition: parser-builder.h:388
Expression trim
Definition: parser-builder.h:126
std::optional< Expression > captures
Definition: parser-builder.h:147
Expression data
Definition: parser-builder.h:114
Definition: production.h:120
Definition: parser-builder.h:85
ParserState state() const
Definition: parser-builder.h:168
Definition: parser-builder.h:151
void pushState(ParserState p)
Definition: parser-builder.h:159
void popState()
Definition: parser-builder.h:165
auto popBuilder()
Definition: parser-builder.h:222
Expression lahead_end
Definition: parser-builder.h:138
auto pushBuilder(std::shared_ptr< hilti::builder::Builder > b)
Definition: parser-builder.h:213
bool needs_look_ahead
Definition: parser-builder.h:108
Definition: parser-builder.h:229
ID unit_id
Definition: parser-builder.h:105
Expression cur
Definition: parser-builder.h:117
auto pushBuilder(std::shared_ptr< hilti::builder::Builder > b, const std::function< void()> &func)
Definition: parser-builder.h:246
Definition: location.h:17
Definition: parser-builder.cc:67
Definition: location.h:93
std::reference_wrapper< const type::Unit > unit
Definition: parser-builder.h:102
ScopeGuard makeScopeGuard()
Definition: parser-builder.h:243