aboutsummaryrefslogtreecommitdiff
path: root/tcl.go
diff options
context:
space:
mode:
Diffstat (limited to 'tcl.go')
-rw-r--r--tcl.go57
1 files changed, 57 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)
+}