Removed some panics with error throwing; changed some comments; removed use of mustPop() in parsing Kleene star - I use pop() and then throw an error if pop() returns an error
This commit is contained in:
19
compile.go
19
compile.go
@@ -344,7 +344,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
}
|
||||
|
||||
if c == '\\' { // Escape character - invert special and non-special characters eg. \( is treated as a literal parentheses, \b is treated as word boundary
|
||||
if i == len(re_postfix)-1 { // End of string - panic, because backslash is an escape character (something needs to come after it)
|
||||
if i == len(re_postfix)-1 { // End of string - throw error, because backslash is an escape character (something needs to come after it)
|
||||
return nil, fmt.Errorf("backslash with no escape character")
|
||||
}
|
||||
i++
|
||||
@@ -426,7 +426,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
regex += string(re_postfix[i])
|
||||
i++
|
||||
}
|
||||
if len(regex) <= 1 { // Nothing in regex - panic
|
||||
if len(regex) <= 1 { // Nothing in regex - throw error
|
||||
return nil, fmt.Errorf("invalid lookaround. (too short?)")
|
||||
}
|
||||
// 'regex' should now contain the lookaround regex, plus the characters at the start (which indicate pos/neg, ahead/behind)
|
||||
@@ -660,7 +660,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
endOfRange = false // Reset the flag
|
||||
}
|
||||
}
|
||||
if i == len(re_postfix) { // We have reached the end of the string, so we didn't encounter a closing brakcet. Panic.
|
||||
if i == len(re_postfix) { // We have reached the end of the string, so we didn't encounter a closing brakcet. Throw error.
|
||||
return nil, fmt.Errorf("opening bracket without closing bracket")
|
||||
}
|
||||
|
||||
@@ -690,7 +690,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
|
||||
startRangeNum, err := strconv.Atoi(string(startRange))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, fmt.Errorf("invalid numeric range")
|
||||
}
|
||||
|
||||
if re_postfix[i] == '}' { // Case 1 above
|
||||
@@ -708,7 +708,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
return nil, fmt.Errorf("brace not closed")
|
||||
}
|
||||
if re_postfix[i] != '}' {
|
||||
return nil, fmt.Errorf("invalid numeric specifier")
|
||||
return nil, fmt.Errorf("invalid start range for numeric specifier")
|
||||
}
|
||||
if len(endRange) == 0 { // Case 3 above
|
||||
endRangeNum = INFINITE_REPS
|
||||
@@ -716,7 +716,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
var err error
|
||||
endRangeNum, err = strconv.Atoi(string(endRange))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, fmt.Errorf("invalid end range for numeric specifier")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -737,7 +737,7 @@ func shuntingYard(re string, flags ...ReFlag) ([]postfixNode, error) {
|
||||
numOpenParens++
|
||||
}
|
||||
if c == ')' {
|
||||
// Keep popping from opStack until we encounter an opening parantheses or a NONCAPLPAREN_CHAR. Panic if we reach the end of the stack.
|
||||
// Keep popping from opStack until we encounter an opening parantheses or a NONCAPLPAREN_CHAR. Throw error if we reach the end of the stack.
|
||||
var val rune
|
||||
var err error
|
||||
for val, err = peek(opStack); val != '(' && val != NONCAPLPAREN_CHAR; val, err = peek(opStack) {
|
||||
@@ -951,7 +951,10 @@ func thompson(re []postfixNode) (Reg, error) {
|
||||
nfa = append(nfa, s1)
|
||||
}
|
||||
case KLEENE: // Create a 0-state, concat the popped state after it, concat the 0-state after the popped state
|
||||
s1 := mustPop(&nfa)
|
||||
s1, err := pop(&nfa)
|
||||
if err != nil {
|
||||
return Reg{}, fmt.Errorf("error applying kleene star")
|
||||
}
|
||||
stateToAdd := kleene(*s1)
|
||||
nfa = append(nfa, stateToAdd)
|
||||
case PLUS: // a+ is equivalent to aa*
|
||||
|
Reference in New Issue
Block a user