aboutsummaryrefslogtreecommitdiff
path: root/tcl.go
diff options
context:
space:
mode:
Diffstat (limited to 'tcl.go')
-rw-r--r--tcl.go25
1 files changed, 18 insertions, 7 deletions
diff --git a/tcl.go b/tcl.go
index c4a4baa..47d7747 100644
--- a/tcl.go
+++ b/tcl.go
@@ -20,29 +20,40 @@ var (
)
var (
- comment = NewParser("comment", Merge(Seq("#", NotChars("\r\n")))).Map(drop)
+ comment = NewParser("comment", Merge(Seq("#", NotChars("\r\n"), Chars("\r\n")))).Map(drop)
wordExp = NewParser("{*}word", Seq("{*}", &word)).Map(resultchild(1))
wordSub = NewParser("[*]word", Seq("[*]", &word)).Map(resultchild(1))
- wordBrc = NewParser("{command}", Seq("{", Many(&command), "}")).Map(func(r *Result) { collectchildren(&r.Child[1]); r.Result = r.Child[1].Result })
wordQtd = NewParser(`"word"`, StringLit(`"`)).Map(token)
- wordSmp = NewParser("simple", NotChars("{}[]* ;\t\r\n")).Map(token)
+ wordSmp = NewParser("simple", NotChars("{} \t\r\n")).Map(token)
+ group = NewParser("{group}", Seq("{", Maybe(Chars("\r\n")), Some(Any(&command, &words)), "}")).Map(func(r *Result) { collectchildren(&r.Child[2]); r.Result = r.Child[2].Result })
)
func init() {
- word = NewParser("word", Any(&wordSmp, &wordQtd, &wordBrc, &wordSub, &wordExp))
+ word = NewParser("word", Any(&wordQtd, &group, &wordSmp, &wordSub, &wordExp))
words = NewParser("words", Many(&word)).Map(collectchildren)
- command = NewParser("command", Seq(&words, Maybe(";"))).Map(resultchild(0))
+ command = NewParser("command", Seq(&words, Any(";", Chars("\r\n")))).Map(resultchild(0))
script = NewParser("script", Many(Any(&comment, &command))).Map(collectchildren)
}
+func simpleWhitespace(s *State) {
+ for s.Pos < len(s.Input) {
+ switch s.Input[s.Pos] {
+ case '\t', '\v', '\f', ' ':
+ s.Pos++
+ default:
+ return
+ }
+ }
+}
+
func Parse(input string) (data interface{}, e error) {
- data, e = Run(&script, input, ASCIIWhitespace)
+ data, e = Run(&script, input, simpleWhitespace)
return
}
func ParseDebug(input string) (data interface{}, e error) {
EnableLogging(os.Stdout)
- data, e = Run(&script, input, ASCIIWhitespace)
+ data, e = Run(&script, input, simpleWhitespace)
return
}