From ca945c7740552fd7ab93a9b2ea58174871d61c28 Mon Sep 17 00:00:00 2001 From: Aadhavan Srinivasan Date: Tue, 29 Oct 2024 00:26:11 -0400 Subject: [PATCH] Added support for character ranges and dot metacharacter --- main.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/main.go b/main.go index 7951d3f..daeef74 100644 --- a/main.go +++ b/main.go @@ -46,6 +46,23 @@ func shuntingYard(re string) []postfixNode { if re_runes[i] == '[' && (i == 0 || re_runes[i-1] != '\\') { // We do not touch things inside brackets, unless they are escaped for re_runes[i] != ']' { i++ // Skip all characters inside brackets + // TODO: Check for escaped characters + + // Check ahead for character range + if i < len(re_runes)-2 && re_runes[i+1] == '-' { + rangeStart := re_runes[i] + rangeEnd := re_runes[i+2] + if int(rangeEnd) < int(rangeStart) { + panic("Range is out of order.") + } + + for i := rangeStart; i <= rangeEnd; i++ { + re_postfix = append(re_postfix, i) + } + + i += 2 // Skip start and hyphen (end will automatically be skipped on next iteration of loop) + continue + } re_postfix = append(re_postfix, re_runes[i]) } continue @@ -74,6 +91,7 @@ func shuntingYard(re string) []postfixNode { ii. current character has greater priority than top of opStack 3. If current character is '(', push to opStack 4. If current character is ')', pop from opStack (and append to outQueue) until '(' is found. Discard parantheses. + 5. If current character is '[', find all the characters until ']', then create a postfixNode containing all these contents. Add this node to outQueue. */ c := re_postfix[i] if isAlphaNum(c) { @@ -88,6 +106,10 @@ func shuntingYard(re string) []postfixNode { // outQueue = append(outQueue, re_postfix[i+1]) // } + if c == '.' { // Dot metacharacter - represents 'any' character, but I am only adding Unicode 0020-007E + outQueue = append(outQueue, newPostfixNode(dotCharacters()...)) + continue + } if isOperator(c) { if len(opStack) == 0 { opStack = append(opStack, c)