Updated handling of '\b' when inside character class, made invalid
escapes an error. The '\b' value refers to a word boundary normally, but refers to the backspace ASCII value inside a character class. I updated newEscapedNode() to deal with this. I also changed the behavior, so that trying to escape any other value results in an error, instead of just returning the character as-is.
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
type NodeType int
|
type NodeType int
|
||||||
|
|
||||||
// This is a slice containing all escapable characters that have special meaning.
|
// This is a slice containing all escapable characters that have special meaning.
|
||||||
@@ -62,7 +64,7 @@ func newCharClassNode(nodes []postfixNode, negated bool) postfixNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new escaped node - the given character is assumed to have been preceded by a backslash
|
// Creates a new escaped node - the given character is assumed to have been preceded by a backslash
|
||||||
func newEscapedNode(c rune) postfixNode {
|
func newEscapedNode(c rune, inCharClass bool) (postfixNode, error) {
|
||||||
toReturn := postfixNode{}
|
toReturn := postfixNode{}
|
||||||
toReturn.startReps = 1
|
toReturn.startReps = 1
|
||||||
toReturn.endReps = 1
|
toReturn.endReps = 1
|
||||||
@@ -86,8 +88,13 @@ func newEscapedNode(c rune) postfixNode {
|
|||||||
toReturn = newPostfixDotNode()
|
toReturn = newPostfixDotNode()
|
||||||
toReturn.except = append([]postfixNode{}, newPostfixNode(wordChars...))
|
toReturn.except = append([]postfixNode{}, newPostfixNode(wordChars...))
|
||||||
case 'b', 'B':
|
case 'b', 'B':
|
||||||
toReturn.nodetype = ASSERTION
|
if c == 'b' && inCharClass {
|
||||||
toReturn.contents = append(toReturn.contents, c)
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, rune(8))
|
||||||
|
} else {
|
||||||
|
toReturn.nodetype = ASSERTION
|
||||||
|
toReturn.contents = append(toReturn.contents, c)
|
||||||
|
}
|
||||||
case 'n': // Newline character
|
case 'n': // Newline character
|
||||||
toReturn.nodetype = CHARACTER
|
toReturn.nodetype = CHARACTER
|
||||||
toReturn.contents = append(toReturn.contents, '\n')
|
toReturn.contents = append(toReturn.contents, '\n')
|
||||||
@@ -110,10 +117,13 @@ func newEscapedNode(c rune) postfixNode {
|
|||||||
toReturn.nodetype = CHARACTER
|
toReturn.nodetype = CHARACTER
|
||||||
toReturn.contents = append(toReturn.contents, rune(11))
|
toReturn.contents = append(toReturn.contents, rune(11))
|
||||||
default: // None of the above - append it as a regular character
|
default: // None of the above - append it as a regular character
|
||||||
|
if isNormalChar(c) { // Normal characters cannot be escaped
|
||||||
|
return postfixNode{}, fmt.Errorf("Invalid escape character.")
|
||||||
|
}
|
||||||
toReturn.nodetype = CHARACTER
|
toReturn.nodetype = CHARACTER
|
||||||
toReturn.contents = append(toReturn.contents, c)
|
toReturn.contents = append(toReturn.contents, c)
|
||||||
}
|
}
|
||||||
return toReturn
|
return toReturn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates and returns a postfixNode based on the given contents
|
// Creates and returns a postfixNode based on the given contents
|
||||||
|
Reference in New Issue
Block a user