feature(parser): deprecate constants & add asserts (#52)
This commit is contained in:
parent
d73793833e
commit
df8f74bbce
@ -80,6 +80,9 @@ namespace xsk::gsc
|
|||||||
%token BREAKPOINT "breakpoint"
|
%token BREAKPOINT "breakpoint"
|
||||||
%token PROFBEGIN "prof_begin"
|
%token PROFBEGIN "prof_begin"
|
||||||
%token PROFEND "prof_end"
|
%token PROFEND "prof_end"
|
||||||
|
%token ASSERT "assert"
|
||||||
|
%token ASSERTEX "assertex"
|
||||||
|
%token ASSERTMSG "assertmsg"
|
||||||
%token THREAD "thread"
|
%token THREAD "thread"
|
||||||
%token CHILDTHREAD "childthread"
|
%token CHILDTHREAD "childthread"
|
||||||
%token THISTHREAD "thisthread"
|
%token THISTHREAD "thisthread"
|
||||||
@ -151,6 +154,7 @@ namespace xsk::gsc
|
|||||||
%type <include::ptr> include
|
%type <include::ptr> include
|
||||||
%type <decl> declaration
|
%type <decl> declaration
|
||||||
%type <decl_usingtree::ptr> decl_usingtree
|
%type <decl_usingtree::ptr> decl_usingtree
|
||||||
|
%type <decl_constant::ptr> decl_constant
|
||||||
%type <decl_function::ptr> decl_function
|
%type <decl_function::ptr> decl_function
|
||||||
%type <stmt> stmt
|
%type <stmt> stmt
|
||||||
%type <stmt> stmt_or_dev
|
%type <stmt> stmt_or_dev
|
||||||
@ -183,6 +187,9 @@ namespace xsk::gsc
|
|||||||
%type <stmt_breakpoint::ptr> stmt_breakpoint
|
%type <stmt_breakpoint::ptr> stmt_breakpoint
|
||||||
%type <stmt_prof_begin::ptr> stmt_prof_begin
|
%type <stmt_prof_begin::ptr> stmt_prof_begin
|
||||||
%type <stmt_prof_end::ptr> stmt_prof_end
|
%type <stmt_prof_end::ptr> stmt_prof_end
|
||||||
|
%type <stmt_assert::ptr> stmt_assert
|
||||||
|
%type <stmt_assertex::ptr> stmt_assertex
|
||||||
|
%type <stmt_assertmsg::ptr> stmt_assertmsg
|
||||||
%type <expr> expr
|
%type <expr> expr
|
||||||
%type <expr> expr_or_empty
|
%type <expr> expr_or_empty
|
||||||
%type <expr> expr_assign
|
%type <expr> expr_assign
|
||||||
@ -296,6 +303,7 @@ declaration
|
|||||||
: DEVBEGIN { $$.as_dev_begin = make_decl_dev_begin(@$); }
|
: DEVBEGIN { $$.as_dev_begin = make_decl_dev_begin(@$); }
|
||||||
| DEVEND { $$.as_dev_end = make_decl_dev_end(@$); }
|
| DEVEND { $$.as_dev_end = make_decl_dev_end(@$); }
|
||||||
| decl_usingtree { $$.as_usingtree = std::move($1); }
|
| decl_usingtree { $$.as_usingtree = std::move($1); }
|
||||||
|
| decl_constant { $$.as_constant = std::move($1); }
|
||||||
| decl_function { $$.as_function = std::move($1); }
|
| decl_function { $$.as_function = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -304,6 +312,14 @@ decl_usingtree
|
|||||||
{ ppr.ban_header(@$); $$ = make_decl_usingtree(@$, std::move($3)); }
|
{ ppr.ban_header(@$); $$ = make_decl_usingtree(@$, std::move($3)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
decl_constant
|
||||||
|
: expr_identifier ASSIGN expr SEMICOLON
|
||||||
|
{
|
||||||
|
ppr.ban_header(@$); $$ = make_decl_constant(@$, std::move($1), std::move($3));
|
||||||
|
printf("%s" , fmt::format("{}: constants deprecated, use #define instead\n", @$.print()).data());
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
decl_function
|
decl_function
|
||||||
: expr_identifier LPAREN expr_parameters RPAREN stmt_comp
|
: expr_identifier LPAREN expr_parameters RPAREN stmt_comp
|
||||||
{ ppr.ban_header(@$); $$ = make_decl_function(@$, std::move($1), std::move($3), std::move($5)); }
|
{ ppr.ban_header(@$); $$ = make_decl_function(@$, std::move($1), std::move($3), std::move($5)); }
|
||||||
@ -335,6 +351,9 @@ stmt
|
|||||||
| stmt_breakpoint { $$.as_breakpoint = std::move($1); }
|
| stmt_breakpoint { $$.as_breakpoint = std::move($1); }
|
||||||
| stmt_prof_begin { $$.as_prof_begin = std::move($1); }
|
| stmt_prof_begin { $$.as_prof_begin = std::move($1); }
|
||||||
| stmt_prof_end { $$.as_prof_end = std::move($1); }
|
| stmt_prof_end { $$.as_prof_end = std::move($1); }
|
||||||
|
| stmt_assert { $$.as_assert = std::move($1); }
|
||||||
|
| stmt_assertex { $$.as_assertex = std::move($1); }
|
||||||
|
| stmt_assertmsg { $$.as_assertmsg = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
stmt_or_dev
|
stmt_or_dev
|
||||||
@ -534,6 +553,21 @@ stmt_prof_end
|
|||||||
{ $$ = make_stmt_prof_end(@$, std::move($3)); }
|
{ $$ = make_stmt_prof_end(@$, std::move($3)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
stmt_assert
|
||||||
|
: ASSERT LPAREN expr_arguments RPAREN SEMICOLON
|
||||||
|
{ $$ = make_stmt_assert(@$, std::move($3)); }
|
||||||
|
;
|
||||||
|
|
||||||
|
stmt_assertex
|
||||||
|
: ASSERTEX LPAREN expr_arguments RPAREN SEMICOLON
|
||||||
|
{ $$ = make_stmt_assertex(@$, std::move($3)); }
|
||||||
|
;
|
||||||
|
|
||||||
|
stmt_assertmsg
|
||||||
|
: ASSERTMSG LPAREN expr_arguments RPAREN SEMICOLON
|
||||||
|
{ $$ = make_stmt_assertmsg(@$, std::move($3)); }
|
||||||
|
;
|
||||||
|
|
||||||
expr
|
expr
|
||||||
: expr_ternary { $$ = std::move($1); }
|
: expr_ternary { $$ = std::move($1); }
|
||||||
| expr_binary { $$ = std::move($1); }
|
| expr_binary { $$ = std::move($1); }
|
||||||
@ -1126,6 +1160,9 @@ std::unordered_map<token::kind, parser::token::token_kind_type> const tok_to_par
|
|||||||
{ token::BREAKPOINT, parser::token::BREAKPOINT },
|
{ token::BREAKPOINT, parser::token::BREAKPOINT },
|
||||||
{ token::PROFBEGIN, parser::token::PROFBEGIN },
|
{ token::PROFBEGIN, parser::token::PROFBEGIN },
|
||||||
{ token::PROFEND, parser::token::PROFEND },
|
{ token::PROFEND, parser::token::PROFEND },
|
||||||
|
{ token::ASSERT, parser::token::ASSERT },
|
||||||
|
{ token::ASSERTEX, parser::token::ASSERTEX },
|
||||||
|
{ token::ASSERTMSG, parser::token::ASSERTMSG },
|
||||||
{ token::THREAD, parser::token::THREAD },
|
{ token::THREAD, parser::token::THREAD },
|
||||||
{ token::CHILDTHREAD, parser::token::CHILDTHREAD },
|
{ token::CHILDTHREAD, parser::token::CHILDTHREAD },
|
||||||
{ token::THISTHREAD, parser::token::THISTHREAD },
|
{ token::THISTHREAD, parser::token::THISTHREAD },
|
||||||
@ -1169,6 +1206,9 @@ std::unordered_map<std::string_view, parser::token::token_kind_type> const keywo
|
|||||||
{ "breakpoint", parser::token::BREAKPOINT },
|
{ "breakpoint", parser::token::BREAKPOINT },
|
||||||
{ "prof_begin", parser::token::PROFBEGIN },
|
{ "prof_begin", parser::token::PROFBEGIN },
|
||||||
{ "prof_end", parser::token::PROFEND },
|
{ "prof_end", parser::token::PROFEND },
|
||||||
|
{ "assert", parser::token::ASSERT },
|
||||||
|
{ "assertex", parser::token::ASSERTEX },
|
||||||
|
{ "assertmsg", parser::token::ASSERTMSG },
|
||||||
{ "thread", parser::token::THREAD },
|
{ "thread", parser::token::THREAD },
|
||||||
{ "childthread", parser::token::CHILDTHREAD },
|
{ "childthread", parser::token::CHILDTHREAD },
|
||||||
{ "thisthread", parser::token::THISTHREAD },
|
{ "thisthread", parser::token::THISTHREAD },
|
||||||
|
@ -30,6 +30,7 @@ auto compiler::emit_program(program const& prog) -> void
|
|||||||
{
|
{
|
||||||
assembly_ = make_assembly();
|
assembly_ = make_assembly();
|
||||||
localfuncs_.clear();
|
localfuncs_.clear();
|
||||||
|
constants_.clear();
|
||||||
developer_thread_ = false;
|
developer_thread_ = false;
|
||||||
animload_ = false;
|
animload_ = false;
|
||||||
animname_ = {};
|
animname_ = {};
|
||||||
@ -87,6 +88,9 @@ auto compiler::emit_decl(decl const& dec) -> void
|
|||||||
case node::decl_usingtree:
|
case node::decl_usingtree:
|
||||||
emit_decl_usingtree(*dec.as_usingtree);
|
emit_decl_usingtree(*dec.as_usingtree);
|
||||||
break;
|
break;
|
||||||
|
case node::decl_constant:
|
||||||
|
emit_decl_constant(*dec.as_constant);
|
||||||
|
break;
|
||||||
case node::decl_function:
|
case node::decl_function:
|
||||||
emit_decl_function(*dec.as_function);
|
emit_decl_function(*dec.as_function);
|
||||||
break;
|
break;
|
||||||
@ -104,6 +108,16 @@ auto compiler::emit_decl_usingtree(decl_usingtree const& animtree) -> void
|
|||||||
animload_ = false;
|
animload_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto compiler::emit_decl_constant(decl_constant const& constant) -> void
|
||||||
|
{
|
||||||
|
auto const it = constants_.find(constant.name->value);
|
||||||
|
|
||||||
|
if (it != constants_.end())
|
||||||
|
throw comp_error(constant.loc(), fmt::format("duplicated constant '{}'", constant.name->value));
|
||||||
|
|
||||||
|
constants_.insert({ constant.name->value, &constant.value });
|
||||||
|
}
|
||||||
|
|
||||||
auto compiler::emit_decl_function(decl_function const& func) -> void
|
auto compiler::emit_decl_function(decl_function const& func) -> void
|
||||||
{
|
{
|
||||||
label_idx_ = 0;
|
label_idx_ = 0;
|
||||||
@ -218,6 +232,15 @@ auto compiler::emit_stmt(stmt const& stm, scope& scp, bool last) -> void
|
|||||||
case node::stmt_prof_end:
|
case node::stmt_prof_end:
|
||||||
emit_stmt_prof_end(*stm.as_prof_end, scp);
|
emit_stmt_prof_end(*stm.as_prof_end, scp);
|
||||||
break;
|
break;
|
||||||
|
case node::stmt_assert:
|
||||||
|
emit_stmt_assert(*stm.as_assert, scp);
|
||||||
|
break;
|
||||||
|
case node::stmt_assertex:
|
||||||
|
emit_stmt_assertex(*stm.as_assertex, scp);
|
||||||
|
break;
|
||||||
|
case node::stmt_assertmsg:
|
||||||
|
emit_stmt_assertmsg(*stm.as_assertmsg, scp);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw comp_error(stm.loc(), "unknown statement");
|
throw comp_error(stm.loc(), "unknown statement");
|
||||||
}
|
}
|
||||||
@ -939,6 +962,21 @@ auto compiler::emit_stmt_prof_end(stmt_prof_end const&, scope&) -> void
|
|||||||
// TODO:
|
// TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto compiler::emit_stmt_assert(stmt_assert const&, scope&) -> void
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
auto compiler::emit_stmt_assertex(stmt_assertex const&, scope&) -> void
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
auto compiler::emit_stmt_assertmsg(stmt_assertmsg const&, scope&) -> void
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
|
||||||
auto compiler::emit_expr(expr const& exp, scope& scp) -> void
|
auto compiler::emit_expr(expr const& exp, scope& scp) -> void
|
||||||
{
|
{
|
||||||
switch (exp.kind())
|
switch (exp.kind())
|
||||||
@ -1378,12 +1416,6 @@ auto compiler::emit_expr_call_pointer(expr_pointer const& exp, scope& scp, bool
|
|||||||
|
|
||||||
auto compiler::emit_expr_call_function(expr_function const& exp, scope& scp, bool is_stmt) -> void
|
auto compiler::emit_expr_call_function(expr_function const& exp, scope& scp, bool is_stmt) -> void
|
||||||
{
|
{
|
||||||
if (is_stmt && ctx_->build() == build::prod)
|
|
||||||
{
|
|
||||||
auto const& name = exp.name->value;
|
|
||||||
if (name == "assert" || name == "assertex" || name == "assertmsg") return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto path = std::string{};
|
auto path = std::string{};
|
||||||
auto type = resolve_function_type(exp, path);
|
auto type = resolve_function_type(exp, path);
|
||||||
|
|
||||||
@ -1869,6 +1901,13 @@ auto compiler::emit_expr_field_ref(expr_field const& exp, scope& scp, bool set)
|
|||||||
|
|
||||||
auto compiler::emit_expr_local_ref(expr_identifier const& exp, scope& scp, bool set) -> void
|
auto compiler::emit_expr_local_ref(expr_identifier const& exp, scope& scp, bool set) -> void
|
||||||
{
|
{
|
||||||
|
auto const it = constants_.find(exp.value);
|
||||||
|
|
||||||
|
if (it != constants_.end())
|
||||||
|
{
|
||||||
|
throw comp_error(exp.loc(), fmt::format("variable name already defined as constant '{}'", exp.value));
|
||||||
|
}
|
||||||
|
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
if (!variable_initialized(exp, scp))
|
if (!variable_initialized(exp, scp))
|
||||||
@ -1976,6 +2015,15 @@ auto compiler::emit_expr_field(expr_field const& exp, scope& scp) -> void
|
|||||||
|
|
||||||
auto compiler::emit_expr_local(expr_identifier const& exp, scope& scp) -> void
|
auto compiler::emit_expr_local(expr_identifier const& exp, scope& scp) -> void
|
||||||
{
|
{
|
||||||
|
auto const it = constants_.find(exp.value);
|
||||||
|
|
||||||
|
if (it != constants_.end())
|
||||||
|
{
|
||||||
|
// should only allow: string, loc string, number, vector
|
||||||
|
emit_expr(*it->second, scp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto index = variable_access(exp, scp);
|
auto index = variable_access(exp, scp);
|
||||||
|
|
||||||
switch (index)
|
switch (index)
|
||||||
@ -2333,6 +2381,9 @@ auto compiler::process_stmt(stmt const& stm, scope& scp) -> void
|
|||||||
case node::stmt_breakpoint:
|
case node::stmt_breakpoint:
|
||||||
case node::stmt_prof_begin:
|
case node::stmt_prof_begin:
|
||||||
case node::stmt_prof_end:
|
case node::stmt_prof_end:
|
||||||
|
case node::stmt_assert:
|
||||||
|
case node::stmt_assertex:
|
||||||
|
case node::stmt_assertmsg:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw comp_error(stm.loc(), "unknown statement");
|
throw comp_error(stm.loc(), "unknown statement");
|
||||||
|
@ -17,6 +17,7 @@ class compiler
|
|||||||
function::ptr function_;
|
function::ptr function_;
|
||||||
std::vector<std::string> stackframe_;
|
std::vector<std::string> stackframe_;
|
||||||
std::vector<std::string> localfuncs_;
|
std::vector<std::string> localfuncs_;
|
||||||
|
std::unordered_map<std::string, expr const*> constants_;
|
||||||
std::unordered_map<node*, scope::ptr> scopes_;
|
std::unordered_map<node*, scope::ptr> scopes_;
|
||||||
std::vector<scope*> break_blks_;
|
std::vector<scope*> break_blks_;
|
||||||
std::vector<scope*> continue_blks_;
|
std::vector<scope*> continue_blks_;
|
||||||
@ -37,6 +38,7 @@ private:
|
|||||||
auto emit_program(program const& prog) -> void;
|
auto emit_program(program const& prog) -> void;
|
||||||
auto emit_decl(decl const& dec) -> void;
|
auto emit_decl(decl const& dec) -> void;
|
||||||
auto emit_decl_usingtree(decl_usingtree const& animtree) -> void;
|
auto emit_decl_usingtree(decl_usingtree const& animtree) -> void;
|
||||||
|
auto emit_decl_constant(decl_constant const& constant) -> void;
|
||||||
auto emit_decl_function(decl_function const& func) -> void;
|
auto emit_decl_function(decl_function const& func) -> void;
|
||||||
auto emit_stmt(stmt const& stm, scope& scp, bool last) -> void;
|
auto emit_stmt(stmt const& stm, scope& scp, bool last) -> void;
|
||||||
auto emit_stmt_list(stmt_list const& stm, scope& scp, bool last) -> void;
|
auto emit_stmt_list(stmt_list const& stm, scope& scp, bool last) -> void;
|
||||||
@ -67,6 +69,9 @@ private:
|
|||||||
auto emit_stmt_breakpoint(stmt_breakpoint const& stm, scope& scp) -> void;
|
auto emit_stmt_breakpoint(stmt_breakpoint const& stm, scope& scp) -> void;
|
||||||
auto emit_stmt_prof_begin(stmt_prof_begin const& stm, scope& scp) -> void;
|
auto emit_stmt_prof_begin(stmt_prof_begin const& stm, scope& scp) -> void;
|
||||||
auto emit_stmt_prof_end(stmt_prof_end const& stm, scope& scp) -> void;
|
auto emit_stmt_prof_end(stmt_prof_end const& stm, scope& scp) -> void;
|
||||||
|
auto emit_stmt_assert(stmt_assert const& stm, scope& scp) -> void;
|
||||||
|
auto emit_stmt_assertex(stmt_assertex const& stm, scope& scp) -> void;
|
||||||
|
auto emit_stmt_assertmsg(stmt_assertmsg const& stm, scope& scp) -> void;
|
||||||
auto emit_expr(expr const& exp, scope& scp) -> void;
|
auto emit_expr(expr const& exp, scope& scp) -> void;
|
||||||
auto emit_expr_assign(expr_assign const& exp, scope& scp) -> void;
|
auto emit_expr_assign(expr_assign const& exp, scope& scp) -> void;
|
||||||
auto emit_expr_clear(expr const& exp, scope& scp) -> void;
|
auto emit_expr_clear(expr const& exp, scope& scp) -> void;
|
||||||
|
@ -530,10 +530,26 @@ stmt_prof_end::stmt_prof_end(location const& loc, expr_arguments::ptr args) : no
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stmt_assert::stmt_assert(location const& loc, expr_arguments::ptr args) : node{ type::stmt_assert, loc }, args{ std::move(args) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt_assertex::stmt_assertex(location const& loc, expr_arguments::ptr args) : node{ type::stmt_assertex, loc }, args{ std::move(args) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt_assertmsg::stmt_assertmsg(location const& loc, expr_arguments::ptr args) : node{ type::stmt_assertmsg, loc }, args{ std::move(args) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
decl_function::decl_function(location const& loc, expr_identifier::ptr name, expr_parameters::ptr params, stmt_comp::ptr body) : node{ type::decl_function, loc }, name{ std::move(name) }, params{ std::move(params) }, body{ std::move(body) }
|
decl_function::decl_function(location const& loc, expr_identifier::ptr name, expr_parameters::ptr params, stmt_comp::ptr body) : node{ type::decl_function, loc }, name{ std::move(name) }, params{ std::move(params) }, body{ std::move(body) }
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
decl_constant::decl_constant(location const& loc, expr_identifier::ptr name, expr value) : node{ type::decl_constant, loc }, name{ std::move(name) }, value{ std::move(value) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
decl_usingtree::decl_usingtree(location const& loc, expr_string::ptr name) : node{ type::decl_usingtree, loc }, name{ std::move(name) }
|
decl_usingtree::decl_usingtree(location const& loc, expr_string::ptr name) : node{ type::decl_usingtree, loc }, name{ std::move(name) }
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -985,6 +1001,9 @@ stmt::~stmt()
|
|||||||
case node::stmt_breakpoint: as_breakpoint.~unique_ptr(); return;
|
case node::stmt_breakpoint: as_breakpoint.~unique_ptr(); return;
|
||||||
case node::stmt_prof_begin: as_prof_begin.~unique_ptr(); return;
|
case node::stmt_prof_begin: as_prof_begin.~unique_ptr(); return;
|
||||||
case node::stmt_prof_end: as_prof_end.~unique_ptr(); return;
|
case node::stmt_prof_end: as_prof_end.~unique_ptr(); return;
|
||||||
|
case node::stmt_assert: as_assert.~unique_ptr(); return;
|
||||||
|
case node::stmt_assertex: as_assertex.~unique_ptr(); return;
|
||||||
|
case node::stmt_assertmsg: as_assertmsg.~unique_ptr(); return;
|
||||||
case node::asm_jmp: as_jump.~unique_ptr(); return;
|
case node::asm_jmp: as_jump.~unique_ptr(); return;
|
||||||
case node::asm_jmp_back: as_jump_back.~unique_ptr(); return;
|
case node::asm_jmp_back: as_jump_back.~unique_ptr(); return;
|
||||||
case node::asm_jmp_cond: as_cond.~unique_ptr(); return;
|
case node::asm_jmp_cond: as_cond.~unique_ptr(); return;
|
||||||
@ -1047,6 +1066,7 @@ decl::~decl()
|
|||||||
case node::decl_dev_begin: as_dev_begin.~unique_ptr(); return;
|
case node::decl_dev_begin: as_dev_begin.~unique_ptr(); return;
|
||||||
case node::decl_dev_end: as_dev_end.~unique_ptr(); return;
|
case node::decl_dev_end: as_dev_end.~unique_ptr(); return;
|
||||||
case node::decl_function: as_function.~unique_ptr(); return;
|
case node::decl_function: as_function.~unique_ptr(); return;
|
||||||
|
case node::decl_constant: as_constant.~unique_ptr(); return;
|
||||||
case node::decl_usingtree: as_usingtree.~unique_ptr(); return;
|
case node::decl_usingtree: as_usingtree.~unique_ptr(); return;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,11 @@ struct node
|
|||||||
stmt_breakpoint,
|
stmt_breakpoint,
|
||||||
stmt_prof_begin,
|
stmt_prof_begin,
|
||||||
stmt_prof_end,
|
stmt_prof_end,
|
||||||
|
stmt_assert,
|
||||||
|
stmt_assertex,
|
||||||
|
stmt_assertmsg,
|
||||||
decl_function,
|
decl_function,
|
||||||
|
decl_constant,
|
||||||
decl_usingtree,
|
decl_usingtree,
|
||||||
decl_dev_begin,
|
decl_dev_begin,
|
||||||
decl_dev_end,
|
decl_dev_end,
|
||||||
@ -256,7 +260,11 @@ struct stmt_return;
|
|||||||
struct stmt_breakpoint;
|
struct stmt_breakpoint;
|
||||||
struct stmt_prof_begin;
|
struct stmt_prof_begin;
|
||||||
struct stmt_prof_end;
|
struct stmt_prof_end;
|
||||||
|
struct stmt_assert;
|
||||||
|
struct stmt_assertex;
|
||||||
|
struct stmt_assertmsg;
|
||||||
struct decl_function;
|
struct decl_function;
|
||||||
|
struct decl_constant;
|
||||||
struct decl_usingtree;
|
struct decl_usingtree;
|
||||||
struct decl_dev_begin;
|
struct decl_dev_begin;
|
||||||
struct decl_dev_end;
|
struct decl_dev_end;
|
||||||
@ -419,6 +427,9 @@ union stmt
|
|||||||
std::unique_ptr<stmt_breakpoint> as_breakpoint;
|
std::unique_ptr<stmt_breakpoint> as_breakpoint;
|
||||||
std::unique_ptr<stmt_prof_begin> as_prof_begin;
|
std::unique_ptr<stmt_prof_begin> as_prof_begin;
|
||||||
std::unique_ptr<stmt_prof_end> as_prof_end;
|
std::unique_ptr<stmt_prof_end> as_prof_end;
|
||||||
|
std::unique_ptr<stmt_assert> as_assert;
|
||||||
|
std::unique_ptr<stmt_assertex> as_assertex;
|
||||||
|
std::unique_ptr<stmt_assertmsg> as_assertmsg;
|
||||||
std::unique_ptr<asm_jmp_cond> as_cond;
|
std::unique_ptr<asm_jmp_cond> as_cond;
|
||||||
std::unique_ptr<asm_jmp> as_jump;
|
std::unique_ptr<asm_jmp> as_jump;
|
||||||
std::unique_ptr<asm_jmp_back> as_jump_back;
|
std::unique_ptr<asm_jmp_back> as_jump_back;
|
||||||
@ -448,6 +459,7 @@ union decl
|
|||||||
std::unique_ptr<decl_dev_begin> as_dev_begin;
|
std::unique_ptr<decl_dev_begin> as_dev_begin;
|
||||||
std::unique_ptr<decl_dev_end> as_dev_end;
|
std::unique_ptr<decl_dev_end> as_dev_end;
|
||||||
std::unique_ptr<decl_usingtree> as_usingtree;
|
std::unique_ptr<decl_usingtree> as_usingtree;
|
||||||
|
std::unique_ptr<decl_constant> as_constant;
|
||||||
std::unique_ptr<decl_function> as_function;
|
std::unique_ptr<decl_function> as_function;
|
||||||
|
|
||||||
decl();
|
decl();
|
||||||
@ -1323,6 +1335,33 @@ struct stmt_prof_end : public node
|
|||||||
stmt_prof_end(location const& loc, expr_arguments::ptr args);
|
stmt_prof_end(location const& loc, expr_arguments::ptr args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct stmt_assert : public node
|
||||||
|
{
|
||||||
|
using ptr = std::unique_ptr<stmt_assert>;
|
||||||
|
|
||||||
|
expr_arguments::ptr args;
|
||||||
|
|
||||||
|
stmt_assert(location const& loc, expr_arguments::ptr args);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stmt_assertex : public node
|
||||||
|
{
|
||||||
|
using ptr = std::unique_ptr<stmt_assertex>;
|
||||||
|
|
||||||
|
expr_arguments::ptr args;
|
||||||
|
|
||||||
|
stmt_assertex(location const& loc, expr_arguments::ptr args);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stmt_assertmsg : public node
|
||||||
|
{
|
||||||
|
using ptr = std::unique_ptr<stmt_assertmsg>;
|
||||||
|
|
||||||
|
expr_arguments::ptr args;
|
||||||
|
|
||||||
|
stmt_assertmsg(location const& loc, expr_arguments::ptr args);
|
||||||
|
};
|
||||||
|
|
||||||
struct decl_function : public node
|
struct decl_function : public node
|
||||||
{
|
{
|
||||||
using ptr = std::unique_ptr<decl_function>;
|
using ptr = std::unique_ptr<decl_function>;
|
||||||
@ -1334,6 +1373,16 @@ struct decl_function : public node
|
|||||||
decl_function(location const& loc, expr_identifier::ptr name, expr_parameters::ptr params, stmt_comp::ptr body);
|
decl_function(location const& loc, expr_identifier::ptr name, expr_parameters::ptr params, stmt_comp::ptr body);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct decl_constant : public node
|
||||||
|
{
|
||||||
|
using ptr = std::unique_ptr<decl_constant>;
|
||||||
|
|
||||||
|
expr_identifier::ptr name;
|
||||||
|
expr value;
|
||||||
|
|
||||||
|
decl_constant(location const& loc, expr_identifier::ptr name, expr value);
|
||||||
|
};
|
||||||
|
|
||||||
struct decl_usingtree : public node
|
struct decl_usingtree : public node
|
||||||
{
|
{
|
||||||
using ptr = std::unique_ptr<decl_usingtree>;
|
using ptr = std::unique_ptr<decl_usingtree>;
|
||||||
@ -1599,7 +1648,11 @@ XSK_GSC_MAKE_GENERIC(stmt_return)
|
|||||||
XSK_GSC_MAKE_GENERIC(stmt_breakpoint)
|
XSK_GSC_MAKE_GENERIC(stmt_breakpoint)
|
||||||
XSK_GSC_MAKE_GENERIC(stmt_prof_begin)
|
XSK_GSC_MAKE_GENERIC(stmt_prof_begin)
|
||||||
XSK_GSC_MAKE_GENERIC(stmt_prof_end)
|
XSK_GSC_MAKE_GENERIC(stmt_prof_end)
|
||||||
|
XSK_GSC_MAKE_GENERIC(stmt_assert)
|
||||||
|
XSK_GSC_MAKE_GENERIC(stmt_assertex)
|
||||||
|
XSK_GSC_MAKE_GENERIC(stmt_assertmsg)
|
||||||
XSK_GSC_MAKE_GENERIC(decl_function)
|
XSK_GSC_MAKE_GENERIC(decl_function)
|
||||||
|
XSK_GSC_MAKE_GENERIC(decl_constant)
|
||||||
XSK_GSC_MAKE_GENERIC(decl_usingtree)
|
XSK_GSC_MAKE_GENERIC(decl_usingtree)
|
||||||
XSK_GSC_MAKE_GENERIC(decl_dev_begin)
|
XSK_GSC_MAKE_GENERIC(decl_dev_begin)
|
||||||
XSK_GSC_MAKE_GENERIC(decl_dev_end)
|
XSK_GSC_MAKE_GENERIC(decl_dev_end)
|
||||||
|
@ -22,8 +22,8 @@ struct token
|
|||||||
DEVBEGIN, DEVEND, INLINE, INCLUDE, USINGTREE, ANIMTREE, ENDON, NOTIFY, WAIT,
|
DEVBEGIN, DEVEND, INLINE, INCLUDE, USINGTREE, ANIMTREE, ENDON, NOTIFY, WAIT,
|
||||||
WAITTILL, WAITTILLMATCH, WAITTILLFRAMEEND, WAITFRAME, IF, ELSE, DO, WHILE,
|
WAITTILL, WAITTILLMATCH, WAITTILLFRAMEEND, WAITFRAME, IF, ELSE, DO, WHILE,
|
||||||
FOR, FOREACH, IN, SWITCH, CASE, DEFAULT, BREAK, CONTINUE, RETURN, BREAKPOINT,
|
FOR, FOREACH, IN, SWITCH, CASE, DEFAULT, BREAK, CONTINUE, RETURN, BREAKPOINT,
|
||||||
PROFBEGIN, PROFEND, THREAD, CHILDTHREAD, THISTHREAD, CALL, TRUE, FALSE, UNDEFINED,
|
PROFBEGIN, PROFEND, ASSERT, ASSERTEX, ASSERTMSG, THREAD, CHILDTHREAD, THISTHREAD,
|
||||||
SIZE, GAME, SELF, ANIM, LEVEL, ISDEFINED, ISTRUE,
|
CALL, TRUE, FALSE, UNDEFINED, SIZE, GAME, SELF, ANIM, LEVEL, ISDEFINED, ISTRUE,
|
||||||
|
|
||||||
HASH, NEWLINE, EOS, DEFINED, MACROBEGIN, MACROEND,
|
HASH, NEWLINE, EOS, DEFINED, MACROBEGIN, MACROEND,
|
||||||
};
|
};
|
||||||
|
3455
src/gsc/parser.cpp
3455
src/gsc/parser.cpp
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -314,6 +314,9 @@ auto source::dump_decl(decl const& dec) -> void
|
|||||||
case node::decl_usingtree:
|
case node::decl_usingtree:
|
||||||
dump_decl_usingtree(*dec.as_usingtree);
|
dump_decl_usingtree(*dec.as_usingtree);
|
||||||
break;
|
break;
|
||||||
|
case node::decl_constant:
|
||||||
|
dump_decl_constant(*dec.as_constant);
|
||||||
|
break;
|
||||||
case node::decl_function:
|
case node::decl_function:
|
||||||
dump_decl_function(*dec.as_function);
|
dump_decl_function(*dec.as_function);
|
||||||
break;
|
break;
|
||||||
@ -339,6 +342,14 @@ auto source::dump_decl_usingtree(decl_usingtree const& dec) -> void
|
|||||||
fmt::format_to(std::back_inserter(buf_), ");\n");
|
fmt::format_to(std::back_inserter(buf_), ");\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto source::dump_decl_constant(decl_constant const& dec) -> void
|
||||||
|
{
|
||||||
|
dump_expr_identifier(*dec.name);
|
||||||
|
fmt::format_to(std::back_inserter(buf_), " = ");
|
||||||
|
dump_expr(dec.value);
|
||||||
|
fmt::format_to(std::back_inserter(buf_), ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
auto source::dump_decl_function(decl_function const& dec) -> void
|
auto source::dump_decl_function(decl_function const& dec) -> void
|
||||||
{
|
{
|
||||||
indent_ = 0;
|
indent_ = 0;
|
||||||
@ -438,6 +449,15 @@ auto source::dump_stmt(stmt const& stm) -> void
|
|||||||
case node::stmt_prof_end:
|
case node::stmt_prof_end:
|
||||||
dump_stmt_prof_end(*stm.as_prof_end);
|
dump_stmt_prof_end(*stm.as_prof_end);
|
||||||
break;
|
break;
|
||||||
|
case node::stmt_assert:
|
||||||
|
dump_stmt_assert(*stm.as_assert);
|
||||||
|
break;
|
||||||
|
case node::stmt_assertex:
|
||||||
|
dump_stmt_assertex(*stm.as_assertex);
|
||||||
|
break;
|
||||||
|
case node::stmt_assertmsg:
|
||||||
|
dump_stmt_assertmsg(*stm.as_assertmsg);
|
||||||
|
break;
|
||||||
case node::asm_jmp:
|
case node::asm_jmp:
|
||||||
dump_asm_jmp(*stm.as_jump);
|
dump_asm_jmp(*stm.as_jump);
|
||||||
break;
|
break;
|
||||||
@ -868,14 +888,35 @@ auto source::dump_stmt_prof_begin(stmt_prof_begin const& stm) -> void
|
|||||||
{
|
{
|
||||||
fmt::format_to(std::back_inserter(buf_), "prof_begin(");
|
fmt::format_to(std::back_inserter(buf_), "prof_begin(");
|
||||||
dump_expr_arguments(*stm.args);
|
dump_expr_arguments(*stm.args);
|
||||||
fmt::format_to(std::back_inserter(buf_), ")");
|
fmt::format_to(std::back_inserter(buf_), ");");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto source::dump_stmt_prof_end(stmt_prof_end const& stm) -> void
|
auto source::dump_stmt_prof_end(stmt_prof_end const& stm) -> void
|
||||||
{
|
{
|
||||||
fmt::format_to(std::back_inserter(buf_), "prof_end(");
|
fmt::format_to(std::back_inserter(buf_), "prof_end(");
|
||||||
dump_expr_arguments(*stm.args);
|
dump_expr_arguments(*stm.args);
|
||||||
fmt::format_to(std::back_inserter(buf_), ")");
|
fmt::format_to(std::back_inserter(buf_), ");");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto source::dump_stmt_assert(stmt_assert const& stm) -> void
|
||||||
|
{
|
||||||
|
fmt::format_to(std::back_inserter(buf_), "assert(");
|
||||||
|
dump_expr_arguments(*stm.args);
|
||||||
|
fmt::format_to(std::back_inserter(buf_), ");");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto source::dump_stmt_assertex(stmt_assertex const& stm) -> void
|
||||||
|
{
|
||||||
|
fmt::format_to(std::back_inserter(buf_), "assertex(");
|
||||||
|
dump_expr_arguments(*stm.args);
|
||||||
|
fmt::format_to(std::back_inserter(buf_), ");");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto source::dump_stmt_assertmsg(stmt_assertmsg const& stm) -> void
|
||||||
|
{
|
||||||
|
fmt::format_to(std::back_inserter(buf_), "assertmsg(");
|
||||||
|
dump_expr_arguments(*stm.args);
|
||||||
|
fmt::format_to(std::back_inserter(buf_), ");");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto source::dump_expr(expr const& exp) -> void
|
auto source::dump_expr(expr const& exp) -> void
|
||||||
|
@ -37,6 +37,7 @@ private:
|
|||||||
auto dump_decl_dev_begin(decl_dev_begin const& dec) -> void;
|
auto dump_decl_dev_begin(decl_dev_begin const& dec) -> void;
|
||||||
auto dump_decl_dev_end(decl_dev_end const& dec) -> void;
|
auto dump_decl_dev_end(decl_dev_end const& dec) -> void;
|
||||||
auto dump_decl_usingtree(decl_usingtree const& dec) -> void;
|
auto dump_decl_usingtree(decl_usingtree const& dec) -> void;
|
||||||
|
auto dump_decl_constant(decl_constant const& dec) -> void;
|
||||||
auto dump_decl_function(decl_function const& dec) -> void;
|
auto dump_decl_function(decl_function const& dec) -> void;
|
||||||
auto dump_stmt(stmt const& stm) -> void;
|
auto dump_stmt(stmt const& stm) -> void;
|
||||||
auto dump_stmt_list(stmt_list const& stm) -> void;
|
auto dump_stmt_list(stmt_list const& stm) -> void;
|
||||||
@ -67,6 +68,9 @@ private:
|
|||||||
auto dump_stmt_breakpoint(stmt_breakpoint const& stm) -> void;
|
auto dump_stmt_breakpoint(stmt_breakpoint const& stm) -> void;
|
||||||
auto dump_stmt_prof_begin(stmt_prof_begin const& stm) -> void;
|
auto dump_stmt_prof_begin(stmt_prof_begin const& stm) -> void;
|
||||||
auto dump_stmt_prof_end(stmt_prof_end const& stm) -> void;
|
auto dump_stmt_prof_end(stmt_prof_end const& stm) -> void;
|
||||||
|
auto dump_stmt_assert(stmt_assert const& stm) -> void;
|
||||||
|
auto dump_stmt_assertex(stmt_assertex const& stm) -> void;
|
||||||
|
auto dump_stmt_assertmsg(stmt_assertmsg const& stm) -> void;
|
||||||
auto dump_expr(expr const& exp) -> void;
|
auto dump_expr(expr const& exp) -> void;
|
||||||
auto dump_expr_increment(expr_increment const& exp) -> void;
|
auto dump_expr_increment(expr_increment const& exp) -> void;
|
||||||
auto dump_expr_decrement(expr_decrement const& exp) -> void;
|
auto dump_expr_decrement(expr_decrement const& exp) -> void;
|
||||||
|
Loading…
Reference in New Issue
Block a user