|
package grammars |
|
|
|
import ( |
|
"fmt" |
|
"strings" |
|
|
|
"github.com/mudler/LocalAI/pkg/utils" |
|
) |
|
|
|
type Rules map[string]string |
|
|
|
func (rules Rules) ToGrammar(options ...func(*GrammarOption)) string { |
|
grammarOpts := &GrammarOption{} |
|
grammarOpts.Apply(options...) |
|
|
|
prefix := grammarOpts.Prefix |
|
maybeArray := grammarOpts.MaybeArray |
|
disableParallelNewLines := grammarOpts.DisableParallelNewLines |
|
maybeString := grammarOpts.MaybeString |
|
noMixedFreeString := grammarOpts.NoMixedFreeString |
|
|
|
var lines []string |
|
|
|
swapRoot := maybeArray || maybeString || prefix != "" |
|
|
|
|
|
|
|
for name, rule := range rules { |
|
if swapRoot && name == "root" { |
|
name = "realvalue" |
|
} |
|
lines = append(lines, fmt.Sprintf("%s ::= %s", name, rule)) |
|
} |
|
|
|
if !swapRoot { |
|
return strings.Join(lines, "\n") |
|
} |
|
|
|
newRoot := "realvalue" |
|
if maybeArray { |
|
newRoot = "arr | realvalue" |
|
} |
|
|
|
freestringRule := "mixedstring" |
|
if noMixedFreeString { |
|
freestringRule = "freestring" |
|
} |
|
|
|
if prefix != "" { |
|
|
|
prefix = utils.EscapeNewLines(prefix) |
|
|
|
if maybeArray && maybeString { |
|
newRoot = "(" + newRoot + ")" |
|
} |
|
|
|
if maybeString { |
|
|
|
newRoot = "( \"" + prefix + "\" " + newRoot + " | " + freestringRule + " ) " |
|
} else { |
|
newRoot = "\"" + prefix + "\" " + "" + newRoot + "" |
|
} |
|
} else if maybeString { |
|
if maybeArray { |
|
|
|
} |
|
|
|
newRoot = freestringRule + " | " + newRoot |
|
} |
|
|
|
lines = append(lines, fmt.Sprintf("%s ::= %s", "root", newRoot)) |
|
if disableParallelNewLines { |
|
lines = append(lines, array) |
|
} else { |
|
lines = append(lines, arrayNewLines) |
|
} |
|
|
|
if maybeArray { |
|
if grammarOpts.ExpectStringsAfterJSON { |
|
lines = append(lines, `mixedstring ::= freestring | freestring arr freestring | (freestring realvalue freestring)* | realvalue | arr`) |
|
} else { |
|
lines = append(lines, `mixedstring ::= freestring | freestring arr | freestring realvalue | realvalue | arr`) |
|
} |
|
} else { |
|
if grammarOpts.ExpectStringsAfterJSON { |
|
lines = append(lines, `mixedstring ::= freestring | (freestring realvalue freestring)* | realvalue`) |
|
} else { |
|
lines = append(lines, `mixedstring ::= freestring | freestring realvalue | realvalue`) |
|
} |
|
} |
|
|
|
return strings.Join(lines, "\n") |
|
} |
|
|