Skip to content

Commit

Permalink
Fix comment prefix check (#469)
Browse files Browse the repository at this point in the history
* fixed comment prefix check in the lexer

* added test cases for comments for the lexer
  • Loading branch information
fktn-k authored Jan 19, 2025
1 parent 258b236 commit d31189b
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/fkYAML/detail/input/lexical_analyzer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,16 @@ class lexical_analyzer {
/// @brief Skip until a newline code or a null character is found.
void scan_comment() {
FK_YAML_ASSERT(*m_cur_itr == '#');
if FK_YAML_LIKELY (m_cur_itr != m_begin_itr) {
switch (*(m_cur_itr - 1)) {
case ' ':
case '\t':
case '\n':
break;
default:
emit_error("Comment must not begin right after non-break characters");
}
}
skip_until_line_end();
}

Expand Down
10 changes: 10 additions & 0 deletions single_include/fkYAML/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3698,6 +3698,16 @@ class lexical_analyzer {
/// @brief Skip until a newline code or a null character is found.
void scan_comment() {
FK_YAML_ASSERT(*m_cur_itr == '#');
if FK_YAML_LIKELY (m_cur_itr != m_begin_itr) {
switch (*(m_cur_itr - 1)) {
case ' ':
case '\t':
case '\n':
break;
default:
emit_error("Comment must not begin right after non-break characters");
}
}
skip_until_line_end();
}

Expand Down
25 changes: 25 additions & 0 deletions tests/unit_test/test_lexical_analyzer_class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,31 @@ TEST_CASE("LexicalAnalyzer_EndOfDocuments") {
REQUIRE(token.type == fkyaml::detail::lexical_token_t::END_OF_BUFFER);
}

TEST_CASE("LexicalAnalyzer_Comment") {
fkyaml::detail::lexical_token token;

SECTION("valid comments") {
auto input = GENERATE(
fkyaml::detail::str_view("# comment"),
fkyaml::detail::str_view(" # comment"),
fkyaml::detail::str_view("\t# comment\n"),
fkyaml::detail::str_view("\n# comment"));
fkyaml::detail::lexical_analyzer lexer(input);
REQUIRE_NOTHROW(token = lexer.get_next_token());
REQUIRE(token.type == fkyaml::detail::lexical_token_t::END_OF_BUFFER);
}

// regression test for https://github.com/fktn-k/fkYAML/pull/469
SECTION("invalid comments") {
fkyaml::detail::str_view input("\'foo\'#invalid");
fkyaml::detail::lexical_analyzer lexer(input);
REQUIRE_NOTHROW(token = lexer.get_next_token());
REQUIRE(token.type == fkyaml::detail::lexical_token_t::SINGLE_QUOTED_SCALAR);
REQUIRE(token.str == "foo");
REQUIRE_THROWS_AS(lexer.get_next_token(), fkyaml::parse_error);
}
}

TEST_CASE("LexicalAnalyzer_Colon") {
fkyaml::detail::lexical_token token;

Expand Down

0 comments on commit d31189b

Please # to comment.