Signed-off-by: hongming <talonwan@yunify.com>
This commit is contained in:
hongming
2020-03-19 22:44:05 +08:00
parent 23f6be88c6
commit 9769357005
332 changed files with 69808 additions and 4129 deletions

View File

@@ -0,0 +1,43 @@
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
}