@ -64,7 +64,7 @@ const (
)
)
func isOperator ( c rune ) bool {
func isOperator ( c rune ) bool {
if c == '+' || c == '?' || c == '*' || c == '|' || c == concatRune {
if c == '+' || c == '?' || c == '*' || c == '|' || c == concatRune || c == lazyPlusRune || c == lazyKleeneRune || c == lazyQuestionRune {
return true
return true
}
}
return false
return false
@ -72,7 +72,7 @@ func isOperator(c rune) bool {
/* priority returns the priority of the given operator */
/* priority returns the priority of the given operator */
func priority ( op rune ) int {
func priority ( op rune ) int {
precedence := [ ] rune { '|' , concatRune , '+' , '*' , '?' }
precedence := [ ] rune { '|' , concatRune , '+' , lazyPlusRune , '*' , lazyKleeneRune , '?' , lazyQuestionRune }
return slices . Index ( precedence , op )
return slices . Index ( precedence , op )
}
}
@ -208,9 +208,6 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
// metacharacter. Later, in thompson(), these will be converted back. This avoids
// metacharacter. Later, in thompson(), these will be converted back. This avoids
// confusion in detecting whether a character is escaped eg. detecting
// confusion in detecting whether a character is escaped eg. detecting
// whether '\\[a]' has an escaped opening bracket (it doesn't).
// whether '\\[a]' has an escaped opening bracket (it doesn't).
//
// 5. Check for non-greedy operators. These are not supported at the moment, so an error
// must be thrown if the user attempts to use a non-greedy operator.
for i := 0 ; i < len ( re_runes_orig ) ; i ++ {
for i := 0 ; i < len ( re_runes_orig ) ; i ++ {
c := re_runes_orig [ i ]
c := re_runes_orig [ i ]
if c == '<' && ( i == 0 || ( re_runes_orig [ i - 1 ] != '\\' && re_runes_orig [ i - 1 ] != '?' ) ) {
if c == '<' && ( i == 0 || ( re_runes_orig [ i - 1 ] != '\\' && re_runes_orig [ i - 1 ] != '?' ) ) {
@ -257,8 +254,16 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
} else if c == ']' && ( i == 0 || re_runes [ len ( re_runes ) - 1 ] != '\\' ) {
} else if c == ']' && ( i == 0 || re_runes [ len ( re_runes ) - 1 ] != '\\' ) {
re_runes = append ( re_runes , rbracketRune )
re_runes = append ( re_runes , rbracketRune )
continue
continue
} else if slices . Contains ( [ ] rune { '+' , '*' , '?' } , c ) && ( i < len ( re_runes_orig ) - 1 && re_runes_orig [ i + 1 ] == '?' ) {
} else if slices . Contains ( [ ] rune { '+' , '*' , '?' } , c ) && ( i > 0 && re_runes_orig [ i - 1 ] != '\\' ) && ( i < len ( re_runes_orig ) - 1 && re_runes_orig [ i + 1 ] == '?' ) {
return nil , fmt . Errorf ( "non-greedy operators are not supported" )
switch c {
case '+' :
re_runes = append ( re_runes , lazyPlusRune )
case '*' :
re_runes = append ( re_runes , lazyKleeneRune )
case '?' :
re_runes = append ( re_runes , lazyQuestionRune )
}
i ++
} else {
} else {
re_runes = append ( re_runes , c )
re_runes = append ( re_runes , c )
}
}
@ -421,7 +426,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
}
}
if i < len ( re_runes ) && ( re_runes [ i ] != '(' && re_runes [ i ] != nonCapLparenRune && re_runes [ i ] != '|' && re_runes [ i ] != '\\' ) || ( i > 0 && re_runes [ i - 1 ] == '\\' ) { // Every character should be concatenated if it is escaped
if i < len ( re_runes ) && ( re_runes [ i ] != '(' && re_runes [ i ] != nonCapLparenRune && re_runes [ i ] != '|' && re_runes [ i ] != '\\' ) || ( i > 0 && re_runes [ i - 1 ] == '\\' ) { // Every character should be concatenated if it is escaped
if i < len ( re_runes ) - 1 {
if i < len ( re_runes ) - 1 {
if re_runes [ i + 1 ] != '|' && re_runes [ i + 1 ] != '*' && re_runes [ i + 1 ] != '+' && re_runes [ i + 1 ] != '?' && re_runes [ i + 1 ] != ')' && re_runes [ i + 1 ] != '{' {
if re_runes [ i + 1 ] != '|' && re_runes [ i + 1 ] != '*' && re_runes [ i + 1 ] != lazyKleeneRune && re_runes [ i + 1 ] != '+' && re_runes [ i + 1 ] != lazyPlusRune && re_runes [ i + 1 ] != '?' && re_runes [ i + 1 ] != lazyQuestionRune && re_runes [ i + 1 ] != ')' && re_runes [ i + 1 ] != '{' {
re_postfix = append ( re_postfix , concatRune )
re_postfix = append ( re_postfix , concatRune )
}
}
}
}