Skip to content

Commit

Permalink
perf: Macro operand parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
slavek-kucera authored Sep 4, 2024
1 parent 7994a21 commit dbbe8ac
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 24 deletions.
51 changes: 27 additions & 24 deletions parser_library/src/parsing/grammar/hlasmparser_multiline.g4
Original file line number Diff line number Diff line change
Expand Up @@ -606,37 +606,40 @@ op_rem_body_mac returns [macop_preprocess_results results, range line_range, siz
op_rem_body_alt_mac [macop_preprocess_results* results]
:
(
(
mac_preproc? comma
{
if ($mac_preproc.ctx) {
append_context_text($results->text, $mac_preproc.ctx);
$results->text_ranges.push_back(provider.get_range($mac_preproc.ctx));
$mac_preproc.ctx = nullptr;
}
$results->text.push_back(',');
$results->text_ranges.push_back(provider.get_range($comma.ctx));
}
)+
mac_preproc
{
append_context_text($results->text, $mac_preproc.ctx);
$results->text_ranges.push_back(provider.get_range($mac_preproc.ctx));
}
)?
(
{enable_continuation();}
COMMA
{
$results->text.push_back(',');
$results->text_ranges.push_back(provider.get_range($COMMA));
}
(
r1=remark_o CONTINUATION
remark_o (CONTINUATION | EOF)
{
if($r1.value) $results->remarks.push_back(std::move(*$r1.value));
if ($remark_o.value)
$results->remarks.push_back(std::move(*$remark_o.value));
}
)?
{disable_continuation();}
)*
(
last_mac_op=mac_preproc? last_remark=remark_o
(
mac_preproc
{
if ($last_mac_op.ctx) {
append_context_text($results->text, $last_mac_op.ctx);
$results->text_ranges.push_back(provider.get_range($last_mac_op.ctx));
}
if ($last_remark.value)
$results->remarks.push_back(std::move(*$last_remark.value));
append_context_text($results->text, $mac_preproc.ctx);
$results->text_ranges.push_back(provider.get_range($mac_preproc.ctx));
}
);
)?
)*
last_remark=remark_o
{
if ($last_remark.value)
$results->remarks.push_back(std::move(*$last_remark.value));
}
;
finally
{disable_continuation();}
23 changes: 23 additions & 0 deletions parser_library/test/context/macro_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1216,3 +1216,26 @@ A EQU X
EXPECT_TRUE(a.diags().empty());
EXPECT_EQ(get_symbol_abs(a.hlasm_ctx(), "A"), 1);
}

TEST(macro, comma_after_continuation)
{
std::string input = R"(
MACRO
MAC
MNOTE '&SYSLIST(2)'
MEND
MACRO
MAC2 &C
mac X
,&C
MEND
MAC2 TEST
)";

analyzer a(input);
a.analyze();

EXPECT_TRUE(matches_message_text(a.diags(), { "TEST" }));
}

0 comments on commit dbbe8ac

Please sign in to comment.