55 lines
980 B
Go
55 lines
980 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
arraystack "github.com/emirpasic/gods/v2/stacks/arraystack"
|
||
|
)
|
||
|
|
||
|
func parseBoolExpr(expression string) bool {
|
||
|
getRune := func(result bool) rune {
|
||
|
if result {
|
||
|
return 't'
|
||
|
}
|
||
|
return 'f'
|
||
|
}
|
||
|
|
||
|
st := arraystack.New[rune]()
|
||
|
|
||
|
for _, token := range expression {
|
||
|
if token == ',' || token == '(' {
|
||
|
// ignore delimiters and opening brackets
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// Handle closing of the operation
|
||
|
if token == ')' {
|
||
|
hasTrue, hasFalse := false, false
|
||
|
|
||
|
for top, has := st.Peek(); has && top != '!' && top != '&' && top != '|'; top, has = st.Peek() {
|
||
|
if top == 't' {
|
||
|
hasTrue = true
|
||
|
} else if top == 'f' {
|
||
|
hasFalse = true
|
||
|
}
|
||
|
st.Pop()
|
||
|
}
|
||
|
|
||
|
// evaluate the operator
|
||
|
op, _ := st.Pop()
|
||
|
if op == '!' {
|
||
|
st.Push(getRune(!hasTrue))
|
||
|
} else if op == '&' {
|
||
|
st.Push(getRune(!hasFalse))
|
||
|
} else {
|
||
|
st.Push(getRune(hasTrue))
|
||
|
}
|
||
|
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
st.Push(token)
|
||
|
}
|
||
|
|
||
|
result, _ := st.Peek()
|
||
|
return result == 't'
|
||
|
}
|