Merge pull request #117 from peoro/master

Fix support to custom AST node types
This commit is contained in:
yhirose 2020-06-18 10:51:46 -04:00 committed by GitHub
commit 8e890ced7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 1 deletions

View File

@ -3937,7 +3937,7 @@ public:
template <typename T = Ast> parser &enable_ast() { template <typename T = Ast> parser &enable_ast() {
for (auto &x : *grammar_) { for (auto &x : *grammar_) {
auto &rule = x.second; auto &rule = x.second;
if (!rule.action) { add_ast_action(rule); } if (!rule.action) { add_ast_action<T>(rule); }
} }
return *this; return *this;
} }

View File

@ -387,6 +387,24 @@ TEST_CASE("Skip token test2", "[general]")
REQUIRE(ret == true); REQUIRE(ret == true);
} }
TEST_CASE("Custom AST test", "[general]")
{
struct CustomType {};
using CustomAst = AstBase<CustomType>;
parser parser(R"(
ROOT <- _ TEXT*
TEXT <- [a-zA-Z]+ _
_ <- [ \t\r\n]*
)");
parser.enable_ast<CustomAst>();
std::shared_ptr<CustomAst> ast;
bool ret = parser.parse("a b c", ast);
REQUIRE(ret == true);
REQUIRE(ast->nodes.size() == 4);
}
TEST_CASE("Backtracking test", "[general]") TEST_CASE("Backtracking test", "[general]")
{ {
parser parser(R"( parser parser(R"(