transpiler
This commit is contained in:
+90
-4
@@ -1,8 +1,94 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ast := Parse("abc123::hello")
|
||||
fmt.Printf("%v", ast)
|
||||
type wmap [2]string
|
||||
|
||||
var wyst_map []wmap
|
||||
|
||||
func TranspileToken(node ASTNode) string {
|
||||
res := ""
|
||||
switch node.Rule {
|
||||
|
||||
case "NUMBER":
|
||||
res += node.Text
|
||||
case "IDENTIFIER":
|
||||
for _, i := range wyst_map {
|
||||
if node.Text == i[0] {
|
||||
return i[1]
|
||||
}
|
||||
}
|
||||
res += "_0x"
|
||||
for _, c := range node.Text {
|
||||
if c == ':' || c == '.' {
|
||||
res += string(c)
|
||||
} else {
|
||||
res += fmt.Sprintf("%x", c)
|
||||
}
|
||||
}
|
||||
case "HEX":
|
||||
res += node.Text
|
||||
case "MATH":
|
||||
res += node.Text
|
||||
case "STRING":
|
||||
res += node.Text
|
||||
case "';'":
|
||||
res += "\n "
|
||||
default:
|
||||
fmt.Printf("\x1b[33mDEV NOTICE:\x1b[0m Missing token case for '%s'\n", node.Rule)
|
||||
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func TranspileNode(node ASTNode) string {
|
||||
res := ""
|
||||
if node.Rule == strings.ToUpper(node.Rule) {
|
||||
return TranspileToken(node)
|
||||
}
|
||||
switch node.Rule {
|
||||
|
||||
case "func_def":
|
||||
res += fmt.Sprintf("func %s%s %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[2]), TranspileNode(node.Inner[0]), TranspileNode(node.Inner[3]))
|
||||
case "expr":
|
||||
res += TranspileNodes(node.Inner)
|
||||
case "code_block":
|
||||
res += "{\n "
|
||||
res += strings.TrimSuffix(TranspileNodes(node.Inner), " ")
|
||||
res += "}\n"
|
||||
case "var_def":
|
||||
res += fmt.Sprintf("var %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[0]))
|
||||
case "round_def":
|
||||
res += "("
|
||||
res += strings.TrimSuffix(strings.ReplaceAll(TranspileNodes(node.Inner), "var ", ""), " ")
|
||||
res += ")"
|
||||
case "asm":
|
||||
if node.Inner[0].Text == "map" && len(node.Inner) == 4 {
|
||||
wyst_map = append(wyst_map, wmap{node.Inner[1].Text, node.Inner[2].Text})
|
||||
}
|
||||
|
||||
default:
|
||||
fmt.Printf("\x1b[33mDEV NOTICE:\x1b[0m Missing case for '%s'\n", node.Rule)
|
||||
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func TranspileNodes(nodes []ASTNode) string {
|
||||
res := ""
|
||||
for i := 0; i < len(nodes); i++ {
|
||||
res += TranspileNode(nodes[i])
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func Transpile(code string) string {
|
||||
ast := Parse(code)
|
||||
res := TranspileNodes(ast.Inner)
|
||||
// fmt.Printf("%v", ast)
|
||||
return res
|
||||
}
|
||||
|
||||
+5
-2
@@ -36,7 +36,10 @@ func ConvertAST(node antlr.Tree, wparser *parser.WystParser, lexer *parser.WystL
|
||||
ast.Text = parseTree.GetText()
|
||||
}
|
||||
for i := 0; i < node.GetChildCount(); i++ {
|
||||
ast.Inner = append(ast.Inner, ConvertAST(node.GetChild(i), wparser, lexer))
|
||||
l := ConvertAST(node.GetChild(i), wparser, lexer)
|
||||
if l.Rule != ("'"+l.Text+"'") || l.Text == ";" {
|
||||
ast.Inner = append(ast.Inner, l)
|
||||
}
|
||||
}
|
||||
}
|
||||
return ast
|
||||
@@ -48,6 +51,6 @@ func Parse(code string) ASTNode {
|
||||
stream := antlr.NewCommonTokenStream(lexer, 0)
|
||||
p := parser.NewWystParser(stream)
|
||||
// p.AddErrorListener(antlr.NewDiagnosticErrorListener(true).WithContext(p))
|
||||
tree := p.Expr()
|
||||
tree := p.Top()
|
||||
return ConvertAST(tree, p, lexer)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type wmap [2]string
|
||||
|
||||
var wyst_map []wmap
|
||||
|
||||
func TranspileToken(node ASTNode) string {
|
||||
res := ""
|
||||
switch node.Rule {
|
||||
|
||||
case "NUMBER":
|
||||
res += node.Text
|
||||
case "IDENTIFIER":
|
||||
for _, i := range wyst_map {
|
||||
if node.Text == i[0] {
|
||||
return i[1]
|
||||
}
|
||||
}
|
||||
res += "_0x"
|
||||
for _, c := range node.Text {
|
||||
if c == ':' || c == '.' {
|
||||
res += string(c)
|
||||
} else {
|
||||
res += fmt.Sprintf("%x", c)
|
||||
}
|
||||
}
|
||||
case "HEX":
|
||||
res += node.Text
|
||||
case "MATH":
|
||||
res += node.Text
|
||||
case "STRING":
|
||||
res += node.Text
|
||||
case "';'":
|
||||
res += "\n "
|
||||
default:
|
||||
fmt.Printf("\x1b[33mDEV NOTICE:\x1b[0m Missing token case for '%s'\n", node.Rule)
|
||||
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func TranspileNode(node ASTNode) string {
|
||||
res := ""
|
||||
if node.Rule == strings.ToUpper(node.Rule) {
|
||||
return TranspileToken(node)
|
||||
}
|
||||
switch node.Rule {
|
||||
|
||||
case "func_def":
|
||||
res += fmt.Sprintf("func %s%s %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[2]), TranspileNode(node.Inner[0]), TranspileNode(node.Inner[3]))
|
||||
case "expr":
|
||||
res += TranspileNodes(node.Inner)
|
||||
case "code_block":
|
||||
res += "{\n "
|
||||
res += strings.TrimSuffix(TranspileNodes(node.Inner), " ")
|
||||
res += "}\n"
|
||||
case "var_def":
|
||||
res += fmt.Sprintf("var %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[0]))
|
||||
case "round_def":
|
||||
res += "("
|
||||
res += strings.TrimSuffix(strings.ReplaceAll(TranspileNodes(node.Inner), "var ", ""), " ")
|
||||
res += ")"
|
||||
case "asm":
|
||||
if node.Inner[0].Text == "map" && len(node.Inner) == 4 {
|
||||
wyst_map = append(wyst_map, wmap{node.Inner[1].Text, node.Inner[2].Text})
|
||||
}
|
||||
|
||||
default:
|
||||
fmt.Printf("\x1b[33mDEV NOTICE:\x1b[0m Missing case for '%s'\n", node.Rule)
|
||||
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func TranspileNodes(nodes []ASTNode) string {
|
||||
res := ""
|
||||
for i := 0; i < len(nodes); i++ {
|
||||
res += TranspileNode(nodes[i])
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func Transpile(code string) string {
|
||||
ast := Parse(code)
|
||||
res := TranspileNodes(ast.Inner)
|
||||
// fmt.Printf("%v", ast)
|
||||
return res
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/antlr4-go/antlr"
|
||||
"github.com/wyst-lang/wyst/parser"
|
||||
)
|
||||
|
||||
func iterateTree(node antlr.Tree, wparser *parser.WystParser, depth int) {
|
||||
if ruleContext, ok := node.(antlr.RuleContext); ok {
|
||||
ruleIndex := ruleContext.GetRuleIndex()
|
||||
ruleName := wparser.RuleNames[ruleIndex]
|
||||
fmt.Printf("%sRule: %s\n", indent(depth), ruleName)
|
||||
}
|
||||
|
||||
if parseTree, ok := node.(antlr.ParseTree); ok {
|
||||
fmt.Printf("%sNode: %s\n", indent(depth), parseTree.GetText())
|
||||
}
|
||||
|
||||
for i := 0; i < node.GetChildCount(); i++ {
|
||||
child := node.GetChild(i)
|
||||
iterateTree(child, wparser, depth+1)
|
||||
}
|
||||
}
|
||||
|
||||
func indent(depth int) string {
|
||||
return fmt.Sprintf("%s", string(make([]byte, depth*2)))
|
||||
}
|
||||
Reference in New Issue
Block a user