Files
weave-scope/experimental/dsl/parser.go
2015-09-01 09:25:03 +02:00

99 lines
2.0 KiB
Go

package main
import (
"fmt"
"log"
)
func parseExpressions(strs []string) []expression {
var exprs []expression
for _, str := range strs {
expr, err := parseExpression(str)
if err != nil {
log.Printf("%s: %v", str, err)
continue
}
log.Printf("%s: OK", str)
exprs = append(exprs, expr)
}
return exprs
}
func parseExpression(str string) (expression, error) {
var (
expr expression
not bool
)
_, c := lex(str)
for item := range c {
switch item.itemType {
case itemNot:
not = !not
case itemAll:
expr.selector = selectAll
case itemConnected:
expr.selector = selectConnected
case itemNonlocal:
expr.selector = selectNonlocal
case itemLike:
item = <-c
switch item.itemType {
case itemRegex:
expr.selector = selectLike(item.literal)
default:
return expression{}, fmt.Errorf("bad LIKE: want %s, got %s", itemRegex, item.itemType)
}
case itemWith:
item = <-c
switch item.itemType {
case itemKeyValue:
expr.selector = selectWith(item.literal)
default:
return expression{}, fmt.Errorf("bad WITH: want %s, got %s", itemKeyValue, item.itemType)
}
case itemHighlight:
expr.transformer = transformHighlight
case itemRemove:
expr.transformer = transformRemove
case itemShowOnly:
expr.transformer = transformShowOnly
case itemMerge:
expr.transformer = transformMerge
case itemGroupBy:
item = <-c
switch item.itemType {
case itemKeyList:
expr.transformer = transformGroupBy(item.literal)
default:
return expression{}, fmt.Errorf("bad GROUPBY: want %s, got %s", itemKeyList, item.itemType)
}
case itemJoin:
item = <-c
switch item.itemType {
case itemKey:
expr.transformer = transformJoin(item.literal)
default:
return expression{}, fmt.Errorf("bad JOIN: want %s, got %s", itemKey, item.itemType)
}
default:
return expression{}, fmt.Errorf("%s: %s", str, item.literal)
}
}
if not {
expr.selector = selectNot(expr.selector)
}
return expr, nil
}