From 100ab5677975491d8d601bde7e208f99f8e02fef Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 15 Nov 2013 13:35:35 -0800 Subject: [PATCH] Parse repeats in regex patterns --- spec/rules/pattern_spec.cpp | 18 ++++++++++++++++++ src/rules/pattern.cpp | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) 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() {