diff --git a/spec/rules/pattern_spec.cpp b/spec/rules/pattern_spec.cpp index 2be10058..427cc6e2 100644 --- a/spec/rules/pattern_spec.cpp +++ b/spec/rules/pattern_spec.cpp @@ -60,4 +60,22 @@ Describe(pattern_rules) { character('b') })->to_string())); } + + It(parses_repeating_rules) { + pattern_ptr rule = pattern("(ab)+(cd)+"); + AssertThat( + rule->to_rule_tree()->to_string(), + Equals( + seq({ + repeat(seq({ + character('a'), + character('b') + })), + repeat(seq({ + character('c'), + character('d') + })), + })->to_string() + )); + } }; \ No newline at end of file diff --git a/src/rules/pattern.cpp b/src/rules/pattern.cpp index 3f345988..c6fad832 100644 --- a/src/rules/pattern.cpp +++ b/src/rules/pattern.cpp @@ -32,7 +32,12 @@ namespace tree_sitter { } rule_ptr factor() { - return atom(); + rule_ptr result = atom(); + if (has_more_input() && (peek() == '+')) { + next(); + result = repeat(result); + } + return result; } rule_ptr atom() {