aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖzgür Kesim <oec@codeblau.de>2019-06-16 20:45:30 +0200
committerÖzgür Kesim <oec@codeblau.de>2019-06-16 20:45:30 +0200
commite3ea0f0201479558d72192ecbbb07afded1f9553 (patch)
tree519bcb9e80a94b8e99650d7edff5109699fe5ffe
parent54d8301b96ad12f85066e13145fc0daf85aad31e (diff)
non functioning init
-rw-r--r--tcl.go57
-rw-r--r--tcl_test.go33
2 files changed, 90 insertions, 0 deletions
diff --git a/tcl.go b/tcl.go
new file mode 100644
index 0000000..3eef16e
--- /dev/null
+++ b/tcl.go
@@ -0,0 +1,57 @@
+package tcl
+
+import (
+ "log"
+ "os"
+
+ "github.com/davecgh/go-spew/spew"
+ . "github.com/oec/goparsify"
+)
+
+// Tcl parser, using combinators
+// Based on the grammer in:
+// https://wiki.tcl-lang.org/page/BNF+for+Tcl
+
+var (
+ word Parser
+ commands Parser
+ script Parser
+)
+
+var (
+ comment = NewParser("comment", Merge(NoAutoWS(Seq("#", NotChars("\r\n"))))).Map(found("comment"))
+ wordExp = NewParser("{*}word", NoAutoWS(Seq("{*}", &word))).Map(found("wordExp"))
+ wordSub = NewParser("[*]word", NoAutoWS(Seq("[*]", &word))).Map(found("wordSub"))
+ wordBrc = NewParser("{word}", Seq("{", &word, "}")).Map(found("wordBrc"))
+ wordQtd = NewParser(`"word"`, StringLit(`"`)).Map(found("wordQtd"))
+ wordSmp = NewParser("simple", NotChars("{}[]*")).Map(found("simple"))
+ command = NewParser("command", Many(&word)).Map(found("command")).Map(found("command"))
+)
+
+func init() {
+ word = NewParser("word", Any(&wordSmp, &wordQtd, &wordBrc, &wordSub, &wordExp)).Map(found("word"))
+ commands = NewParser("commands", Any(&command, Maybe(Chars(";"))))
+ script = NewParser("script", Many(Any(&comment, &commands)))
+}
+
+func Parse(input string) (data interface{}, e error) {
+ data, e = Run(&script, input, ASCIIWhitespace)
+ return
+}
+
+func ParseDebug(input string) (data interface{}, e error) {
+ EnableLogging(os.Stdout)
+ data, e = Run(&script, input, ASCIIWhitespace)
+ return
+}
+
+func found(typ string) func(*Result) {
+ return func(r *Result) {
+ log.Println("found a", typ)
+ spew.Dump(r)
+
+ }
+}
+func dump(r *Result) {
+ spew.Dump(r)
+}
diff --git a/tcl_test.go b/tcl_test.go
new file mode 100644
index 0000000..88c34be
--- /dev/null
+++ b/tcl_test.go
@@ -0,0 +1,33 @@
+package tcl
+
+import "testing"
+
+func TestFirst(t *testing.T) {
+ input := `#TMSH-VERSION: 12.1.2
+
+cli admin-partitions {
+ update-partition Common
+}
+apm report default-report {
+ report-name sessionReports/sessionSummary
+ user /Common/admin
+}
+auth user admin {
+ description "Admin User"
+ encrypted-password $6$IIhG.HP4$kmWDt3Czta4rK5Ct4rYgaGSCDtqkMbAIgCUUdIDaQ/W8HTVHy7F1EZmSM.KYO9sdxDTuggaAGHj7QO/8f9rB80
+ partition-access {
+ all-partitions {
+ role admin
+ }
+ }
+ shell bash
+}`
+
+ d, e := ParseDebug(input)
+ if e != nil {
+ t.Fatal(e)
+ }
+
+ t.Logf("got d: %#v\n", d)
+
+}