polserver/pol-core/bscript/compiler/codegen/InstructionGenerator.h

91 lines
3.9 KiB
C
Raw Permalink Normal View History

#ifndef POLSERVER_INSTRUCTIONGENERATOR_H
#define POLSERVER_INSTRUCTIONGENERATOR_H
#include "bscript/compiler/ast/NodeVisitor.h"
#include <map>
#include <string>
namespace Pol::Bscript::Compiler
{
class FlowControlLabel;
class InstructionEmitter;
class SourceLocation;
class InstructionGenerator : public NodeVisitor
{
public:
InstructionGenerator( InstructionEmitter&,
std::map<std::string, FlowControlLabel>& user_function_labels,
bool in_function);
2020-08-19 10:43:08 -07:00
void generate( Node& );
void update_debug_location( const Node& );
void update_debug_location( const SourceLocation& );
void visit_array_initializer( ArrayInitializer& ) override;
void visit_basic_for_loop( BasicForLoop& loop ) override;
void visit_case_statement( CaseStatement& ) override;
void visit_cstyle_for_loop( CstyleForLoop& loop ) override;
2020-09-01 22:49:48 -07:00
void visit_binary_operator( BinaryOperator& ) override;
void visit_block( Block& ) override;
void visit_boolean_value( BooleanValue& ) override;
void visit_branch_selector( BranchSelector& ) override;
void visit_debug_statement_marker( DebugStatementMarker& ) override;
void visit_dictionary_entry( DictionaryEntry& ) override;
void visit_dictionary_initializer( DictionaryInitializer& ) override;
void visit_do_while_loop( DoWhileLoop& ) override;
void visit_element_access( ElementAccess& ) override;
void visit_element_assignment( ElementAssignment& ) override;
void visit_elvis_operator( ElvisOperator& elvis ) override;
void visit_error_initializer( ErrorInitializer& ) override;
void visit_exit_statement( ExitStatement& ) override;
2020-08-19 10:43:08 -07:00
void visit_float_value( FloatValue& ) override;
void visit_foreach_loop( ForeachLoop& ) override;
void visit_function_call( FunctionCall& ) override;
void visit_function_parameter_list( FunctionParameterList& ) override;
void visit_function_parameter_declaration( FunctionParameterDeclaration& ) override;
void visit_function_reference( FunctionReference& ) override;
void visit_identifier( Identifier& ) override;
void visit_if_then_else_statement( IfThenElseStatement& ) override;
2020-08-25 23:27:24 -07:00
void visit_integer_value( IntegerValue& ) override;
void visit_jump_statement( JumpStatement& ) override;
void visit_member_access( MemberAccess& member_access ) override;
void visit_member_assignment( MemberAssignment& ) override;
void visit_member_assignment_by_operator( MemberAssignmentByOperator& ) override;
void visit_method_call( MethodCall& member_call ) override;
void visit_program( Program& ) override;
void visit_program_parameter_declaration( ProgramParameterDeclaration& ) override;
void visit_repeat_until_loop( RepeatUntilLoop& repeat_until ) override;
void visit_return_statement( ReturnStatement& ) override;
void visit_string_value( StringValue& ) override;
void visit_struct_initializer( StructInitializer& ) override;
void visit_struct_member_initializer( StructMemberInitializer& ) override;
void visit_unary_operator( UnaryOperator& ) override;
void visit_uninitialized_value( UninitializedValue& ) override;
void visit_user_function( UserFunction& ) override;
void visit_value_consumer( ValueConsumer& ) override;
void visit_var_statement( VarStatement& ) override;
void visit_variable_assignment_statement( VariableAssignmentStatement& ) override;
void visit_while_loop( WhileLoop& ) override;
Add support for interpolated strings ("interstrings") (#369) * Update grammar to support interpolated strings * Struct initializers, case switchs are regular strings * Initial stub for interpolated string in AST This splits the previous STRING_LITERAL terminal into a production, stringLiteral, to handle REGULAR_STRING terminal and interpolatedString production. * Change interpolated strings to expressions * Fix mode handling in grammar * Grammar fixes - Fix mode handling in lexer - Interpolated strings only have one expression * Can successfully parse, stub compile interstrings $"He {there + print("hello")}"; * Add formatting string to grammar * Fix tests, and add test stubs * Rename curleys to brace; better AST generation * initial work interstring instruction * Initial work on formatted string instruction: emit * Formatted string instruction: execution * Add simple formatted string test * Add formatted string test src * Review changes #1 - Rename `FormattedString` to `FormatExpression` - Rename overloaded `try_to_format()` to `get_formatted()` * Review changes part 2 - Rename `InterpolatedString` ast node to `InterpolateString` * Review changes part 3 - Modify `ins_interpolate_string` * Review changes part 4 - Remove unused formal parameter * Add negative tests * Spruce up positive tests * Fix braces, escape chars inside interstring * Fix, add tests for escaped char and double brace * Address differences for new lines in tests * Update Escript version * Make empty expression an error * Add documentation for interpolated strings * Quick touchup on docs
2021-03-11 22:48:16 +01:00
void visit_interpolate_string( InterpolateString& ) override;
void visit_format_expression( FormatExpression& ) override;
void visit_conditional_operator( ConditionalOperator& ) override;
private:
// There are two of these because sometimes when calling a method
// on InstructionEmitter, the variable name reads better as a noun,
// and sometimes it reads better as a verb.
InstructionEmitter& emitter;
InstructionEmitter& emit;
std::map<std::string, FlowControlLabel>& user_function_labels;
const bool in_function;
};
} // namespace Pol::Bscript::Compiler
#endif // POLSERVER_INSTRUCTIONGENERATOR_H