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 {
59 extern const hilti::Type Type;
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);
213 _builders.emplace_back(b);
218 std::shared_ptr<hilti::builder::Builder> pushBuilder();
222 auto x = _builders.back();
223 _builders.pop_back();
245 auto pushBuilder(std::shared_ptr<hilti::builder::Builder> b,
const std::function<
void()>& func) {
253 Expression parseType(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst);
256 Expression parseTypeTry(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst);
259 hilti::type::Function parseMethodFunctionType(std::optional<type::function::Parameter> addl_param = {},
271 Expression parseLiteral(
const Production& p,
const std::optional<Expression>& dst);
284 void waitForInput(
const Expression& min,
const std::string& error_msg,
const Meta&
location);
297 Expression waitForInputOrEod(
const Expression& min);
306 void waitForInput(
const std::string& error_msg,
const Meta& location);
316 Expression waitForInputOrEod();
334 void advanceInput(
const Expression& i);
341 void setInput(
const Expression& i);
348 void saveParsePosition();
363 void consumeLookAhead(std::optional<Expression> dst = {});
366 void parseError(
const std::string& error_msg,
const Meta& location);
369 void parseError(
const Expression& error_msg,
const Meta& location);
372 void parseError(
const std::string& fmt, std::vector<Expression> args,
const Meta& location);
375 void newValueForField(
const production::Meta& meta,
const Expression& value,
const Expression& dd);
393 Expression newContainerItem(
const type::unit::item::Field& field,
const Expression&
self,
const Expression& item,
404 std::optional<Expression> dst = {});
413 void trimInput(
bool force =
false);
421 void initializeUnit(
const Location& l);
430 void finalizeUnit(
bool success,
const Location& l);
433 void initBacktracking();
436 void finishBacktracking();
444 Expression initLoopBody();
454 void finishLoopBody(
const Expression& cookie,
const Location& l);
456 CodeGen* cg()
const {
return _cg; }
457 const std::shared_ptr<hilti::Context>& context()
const;
464 Expression _parseType(
const Type& t,
const production::Meta& meta,
const std::optional<Expression>& dst,
467 std::vector<ParserState> _states;
468 std::vector<std::shared_ptr<hilti::builder::Builder>> _builders;
469 std::map<ID, Expression> _functions;
470 bool _report_new_value_for_field =
true;
Definition: function.h:69
void enableDefaultNewValueForField(bool enable)
Definition: parser-builder.h:381
auto builder()
Definition: parser-builder.h:209
bool isEnabledDefaultNewValueForField()
Definition: parser-builder.h:387
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:221
Expression lahead_end
Definition: parser-builder.h:138
auto pushBuilder(std::shared_ptr< hilti::builder::Builder > b)
Definition: parser-builder.h:212
bool needs_look_ahead
Definition: parser-builder.h:108
Definition: parser-builder.h:228
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:245
Definition: location.h:17
Definition: parser-builder.cc:65
Definition: location.h:86
std::reference_wrapper< const type::Unit > unit
Definition: parser-builder.h:102
ScopeGuard makeScopeGuard()
Definition: parser-builder.h:242