Wrote function to provide correct node for escaped character
This commit is contained in:
@@ -1,16 +1,18 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "slices"
|
||||||
|
|
||||||
type NodeType int
|
type NodeType int
|
||||||
|
|
||||||
// This is a list of the possible node types
|
// This is a list of the possible node types
|
||||||
const (
|
const (
|
||||||
CHARACTER NodeType = iota
|
CHARACTER NodeType = iota
|
||||||
|
|
||||||
PIPE
|
PIPE
|
||||||
CONCATENATE
|
CONCATENATE
|
||||||
KLEENE
|
KLEENE
|
||||||
QUESTION
|
QUESTION
|
||||||
PLUS
|
PLUS
|
||||||
|
ASSERTION
|
||||||
)
|
)
|
||||||
|
|
||||||
// This represents a node in the postfix representation of the expression
|
// This represents a node in the postfix representation of the expression
|
||||||
@@ -19,6 +21,41 @@ type postfixNode struct {
|
|||||||
contents []rune // Contents of the node - the length of this would only be >1 if the node represents a character class
|
contents []rune // Contents of the node - the length of this would only be >1 if the node represents a character class
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creates a new escaped node - the given character is assumed to have been preceded by a backslash
|
||||||
|
func newEscapedNode(c rune) postfixNode {
|
||||||
|
toReturn := postfixNode{}
|
||||||
|
switch c {
|
||||||
|
case 's': // Whitespace
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, whitespaceChars...)
|
||||||
|
case 'S': // Non-whitespace - I am doing this in a fancy way, generating all dot characters, then removing whitespace characters from it
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, slices.DeleteFunc(dotChars(), func(r rune) bool {
|
||||||
|
return slices.Contains(whitespaceChars, r)
|
||||||
|
})...)
|
||||||
|
case 'd': // Digits
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, digitChars...)
|
||||||
|
case 'D': // Non-digits - same fancy way as 'S'
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, slices.DeleteFunc(dotChars(), func(r rune) bool {
|
||||||
|
return slices.Contains(digitChars, r)
|
||||||
|
})...)
|
||||||
|
case 'w': // word character
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, wordChars...)
|
||||||
|
case 'W': // Non-word character - same fancy way as 'S' and 'D'
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, slices.DeleteFunc(dotChars(), func(r rune) bool {
|
||||||
|
return slices.Contains(wordChars, r)
|
||||||
|
})...)
|
||||||
|
default: // None of the above - append it as a regular character
|
||||||
|
toReturn.nodetype = CHARACTER
|
||||||
|
toReturn.contents = append(toReturn.contents, c)
|
||||||
|
}
|
||||||
|
return toReturn
|
||||||
|
}
|
||||||
|
|
||||||
// Creates and returns a postfixNode based on the given contents
|
// Creates and returns a postfixNode based on the given contents
|
||||||
func newPostfixNode(contents ...rune) postfixNode {
|
func newPostfixNode(contents ...rune) postfixNode {
|
||||||
if len(contents) < 1 {
|
if len(contents) < 1 {
|
||||||
|
Reference in New Issue
Block a user