Skip to content

Instantly share code, notes, and snippets.

@libliflin
Created March 24, 2016 02:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save libliflin/2c592f5d402ae76be1dc to your computer and use it in GitHub Desktop.
Save libliflin/2c592f5d402ae76be1dc to your computer and use it in GitHub Desktop.
Convert oracle html grammars to antlr4
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"regexp"
"strings"
)
func main() {
fname := os.Args[1]
test := true
if len(os.Args) == 2 {
test = false
}
grmr, grmrfname := processFile(fname)
if test {
fmt.Printf("%s", grmr)
} else {
ioutil.WriteFile(grmrfname, []byte(grmr), 0644)
err := os.Remove(fname)
check(err)
}
}
func processFile(fname string) (string, string) {
dat, err := ioutil.ReadFile(fname)
check(err)
grmr, err := to_grmr(string(dat))
check(err)
grmr_name, err := to_grmr_name(fname)
check(err)
grmr = strings.Replace(grmr, "'", " '\\'' ", -1)
grmr = strings.Replace(grmr, ">", " '>' ", -1)
grmr = strings.Replace(grmr, ";", " ';' ", -1)
grmr = fmt.Sprintf("grammar %s;\n\n%s : %s\t;\n", grmr_name, grmr_name, grmr)
grmr = strings.Replace(grmr, "<b>", " '", -1)
grmr = strings.Replace(grmr, "</b>", "' ", -1)
grmr = strings.Replace(grmr, "(", " '(' ", -1)
grmr = strings.Replace(grmr, ")", " ')' ", -1)
grmr = strings.Replace(grmr, ",", " ',' ", -1)
grmr = strings.Replace(grmr, "[", "(", -1)
grmr = strings.Replace(grmr, "]", ")? ", -1)
grmr = strings.Replace(grmr, "...", "", -1)
grmr = strings.Replace(grmr, "{", "(", -1)
grmr = strings.Replace(grmr, "}", ")", -1)
// a lone *
r := regexp.MustCompile("[^*][+]")
grmr = r.ReplaceAllString(grmr, " '+' ")
// a lone /
r = regexp.MustCompile("[^*]/[^*]")
grmr = r.ReplaceAllString(grmr, " '/' ")
grmr = strings.Replace(grmr, "/*+", " '/*+' ", -1)
grmr = strings.Replace(grmr, "*/", " '*/' ", -1)
grmr = strings.Replace(grmr, ".", " '.' ", -1)
return grmr, grmr_name + ".g4"
}
// pulls the pre tag out of the html file.
func to_grmr(htm string) (string, error) {
start := strings.Index(htm, "<pre>")
end := strings.Index(htm, "</pre>")
if start == -1 || end == -1 {
return "", errors.New("not a valid html: missing pre")
}
start = start + 6
if end <= start {
return "", errors.New("nothing in pre tags")
}
return htm[start:end], nil
}
func to_grmr_name(fname string) (string, error) {
if !strings.HasSuffix(fname, ".htm") {
return "", errors.New("fname is not a .htm ")
}
return fname[:len(fname)-4], nil
}
func check(e error) {
if e != nil {
panic(e)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment