Files
2023-04-19 20:24:34 +02:00

44 lines
1.1 KiB
Go

package gintersect
// Simplify accepts a Token slice and returns a equivalient Token slice that is shorter/simpler.
// The only simplification currently applied is removing redundant flagged Tokens.
// TODO: Remove unflagged Tokens next to equivalen Tokens with FlagPlus. Example: tt+t == t+
func Simplify(tokens []Token) []Token {
if len(tokens) == 0 {
return tokens
}
simple := make([]Token, 1, len(tokens))
simple[0] = tokens[0]
latest := simple[0]
for i := 1; i < len(tokens); i++ {
handled := false
// Possible simplifications to apply if there is a flag.
if tokens[i].Flag() != FlagNone && latest.Flag() != FlagNone {
// If the token contents are the same, then apply simplification.
if tokens[i].Equal(latest) {
var flag Flag
// FlagPlus takes precedence, because:
// t+t* == t+
// t*t+ == t+
if tokens[i].Flag() == FlagPlus || latest.Flag() == FlagPlus {
flag = FlagPlus
} else {
flag = FlagStar
}
simple[len(simple)-1].SetFlag(flag)
handled = true
}
}
if !handled {
latest = tokens[i]
simple = append(simple, tokens[i])
}
}
return simple
}