Added support for character ranges and dot metacharacter

master
Aadhavan Srinivasan 2 months ago
parent 2af4a5f9fd
commit ca945c7740

@ -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)

Loading…
Cancel
Save