diff options
| author | Xe <me@christine.website> | 2022-12-30 10:13:56 -0500 |
|---|---|---|
| committer | Xe <me@christine.website> | 2022-12-30 10:13:56 -0500 |
| commit | e3e8ebbcf82f221d026385c5a85d0afde62b3e3d (patch) | |
| tree | 1ab8a5811db5a64ed14d3112e47730d0fe97325a /cmd/hlang/h/simplify.go | |
| parent | 9bdbd3156177640afaf18ca2c4ad783138004e4a (diff) | |
| download | x-e3e8ebbcf82f221d026385c5a85d0afde62b3e3d.tar.xz x-e3e8ebbcf82f221d026385c5a85d0afde62b3e3d.zip | |
add old hlang draft
Signed-off-by: Xe <me@christine.website>
Diffstat (limited to 'cmd/hlang/h/simplify.go')
| -rw-r--r-- | cmd/hlang/h/simplify.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/cmd/hlang/h/simplify.go b/cmd/hlang/h/simplify.go new file mode 100644 index 0000000..36013df --- /dev/null +++ b/cmd/hlang/h/simplify.go @@ -0,0 +1,59 @@ +package h + +import ( + "strings" + + "github.com/eaburns/peggy/peg" +) + +// RemoveSpace removes whitespace-only nodes. +func RemoveSpace(n *peg.Node) { removeSpace(n) } + +func removeSpace(n *peg.Node) bool { + if whitespace(n.Text) { + return false + } + if len(n.Kids) == 0 { + return true + } + var kids []*peg.Node + for _, k := range n.Kids { + if removeSpace(k) { + kids = append(kids, k) + } + } + n.Kids = kids + return len(n.Kids) > 0 +} + +// SpaceChars is the string of all whitespace characters. +const SpaceChars = "\x20" + +func whitespace(s string) bool { + for _, r := range s { + if !strings.ContainsRune(SpaceChars, r) { + return false + } + } + return true +} + +// CollapseLists collapses chains of single-kid nodes. +func CollapseLists(n *peg.Node) { + if collapseLists(n) == 1 { + n.Kids = n.Kids[0].Kids + } +} + +func collapseLists(n *peg.Node) int { + var kids []*peg.Node + for _, k := range n.Kids { + if gk := collapseLists(k); gk == 1 { + kids = append(kids, k.Kids[0]) + } else { + kids = append(kids, k) + } + } + n.Kids = kids + return len(n.Kids) +} |
