module system
This commit is contained in:
@@ -25,3 +25,5 @@ go.work
|
|||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
.antlr/
|
.antlr/
|
||||||
|
|
||||||
|
test/
|
||||||
@@ -7,6 +7,9 @@ IDENTIFIER: [a-zA-Z_] [a-zA-Z0-9_]* ('::' [a-zA-Z_] [a-zA-Z0-9_]*)*;
|
|||||||
MATH: '+' | '-' | '*' | '/';
|
MATH: '+' | '-' | '*' | '/';
|
||||||
fragment ESC: '\\' ['"\\] ;
|
fragment ESC: '\\' ['"\\] ;
|
||||||
STRING: '"' (ESC | ~["\\])* '"';
|
STRING: '"' (ESC | ~["\\])* '"';
|
||||||
|
MODULE_NAME: [a-zA-Z_] [a-zA-Z0-9_]*;
|
||||||
|
|
||||||
|
|
||||||
round_def: '(' (var_def (',' var_def)* ','?)? ')';
|
round_def: '(' (var_def (',' var_def)* ','?)? ')';
|
||||||
enum_curly: '{' (var_def ';')* '}';
|
enum_curly: '{' (var_def ';')* '}';
|
||||||
round_call: '(' (expr (',' expr)* ','?)? ')';
|
round_call: '(' (expr (',' expr)* ','?)? ')';
|
||||||
@@ -17,7 +20,7 @@ var_def_set: var_def '=' expr;
|
|||||||
call_tree: (fn_call|IDENTIFIER) ('.' (fn_call|IDENTIFIER))*;
|
call_tree: (fn_call|IDENTIFIER) ('.' (fn_call|IDENTIFIER))*;
|
||||||
struct_def: 'struct' IDENTIFIER enum_curly;
|
struct_def: 'struct' IDENTIFIER enum_curly;
|
||||||
namespace: 'namespace' IDENTIFIER '{' (((var_def|var_def_set) ';')|func_def)* '}';
|
namespace: 'namespace' IDENTIFIER '{' (((var_def|var_def_set) ';')|func_def)* '}';
|
||||||
import_statement: 'include' IDENTIFIER ';';
|
import_statement: 'include' MODULE_NAME ';';
|
||||||
use_statement: 'use' IDENTIFIER ';';
|
use_statement: 'use' IDENTIFIER ';';
|
||||||
|
|
||||||
expr:
|
expr:
|
||||||
|
|||||||
+2
-12
@@ -1,16 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
content, err := os.ReadFile("test/main.wst")
|
root := NewRoot("src/main.wyst")
|
||||||
if err != nil {
|
WriteRoot(root)
|
||||||
fmt.Println("Error reading file:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
code := Transpile(string(content))
|
|
||||||
fmt.Printf("output:\n%s\n", code)
|
|
||||||
}
|
}
|
||||||
|
|||||||
+37
-31
@@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
type wmap [2]string
|
type wmap [2]string
|
||||||
|
|
||||||
var wyst_map []wmap
|
var wyst_map []wmap = []wmap{{"int", "int"}, {"void", "void"}, {"main", "main"}}
|
||||||
|
|
||||||
func TranspileToken(node ASTNode) string {
|
func TranspileToken(node ASTNode) string {
|
||||||
res := ""
|
res := ""
|
||||||
@@ -21,7 +21,7 @@ func TranspileToken(node ASTNode) string {
|
|||||||
return i[1]
|
return i[1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res += "_0x"
|
res += "I0x"
|
||||||
for _, c := range node.Text {
|
for _, c := range node.Text {
|
||||||
if c == ':' || c == '.' {
|
if c == ':' || c == '.' {
|
||||||
res += string(c)
|
res += string(c)
|
||||||
@@ -29,7 +29,7 @@ func TranspileToken(node ASTNode) string {
|
|||||||
res += fmt.Sprintf("%x", c)
|
res += fmt.Sprintf("%x", c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res = strings.ReplaceAll(res, "::", "._0x")
|
res = strings.ReplaceAll(res, "::", ".I0x")
|
||||||
case "HEX":
|
case "HEX":
|
||||||
res += node.Text
|
res += node.Text
|
||||||
case "MATH":
|
case "MATH":
|
||||||
@@ -50,7 +50,7 @@ func TranspileToken(node ASTNode) string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func TranspileNode(node ASTNode) string {
|
func (m *Module) TranspileNode(node ASTNode) string {
|
||||||
res := ""
|
res := ""
|
||||||
if node.Rule == strings.ToUpper(node.Rule) {
|
if node.Rule == strings.ToUpper(node.Rule) {
|
||||||
return TranspileToken(node)
|
return TranspileToken(node)
|
||||||
@@ -58,72 +58,78 @@ func TranspileNode(node ASTNode) string {
|
|||||||
switch node.Rule {
|
switch node.Rule {
|
||||||
|
|
||||||
case "func_def":
|
case "func_def":
|
||||||
return_type := TranspileNode(node.Inner[0])
|
return_type := m.TranspileNode(node.Inner[0])
|
||||||
if return_type == "_0x766f6964" {
|
if return_type == "void" {
|
||||||
return_type = ""
|
return_type = ""
|
||||||
}
|
}
|
||||||
res += fmt.Sprintf("func %s%s %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[2]), return_type, TranspileNode(node.Inner[3]))
|
res += fmt.Sprintf("func %s%s %s %s", m.TranspileNode(node.Inner[1]), m.TranspileNode(node.Inner[2]), return_type, m.TranspileNode(node.Inner[3]))
|
||||||
case "expr":
|
case "expr":
|
||||||
res += TranspileNodes(node.Inner)
|
res += m.TranspileNodes(node.Inner)
|
||||||
case "code_block":
|
case "code_block":
|
||||||
res += fmt.Sprintf("{\n %s}", strings.TrimSuffix(TranspileNodes(node.Inner), " "))
|
res += fmt.Sprintf("{\n %s}", strings.TrimSuffix(m.TranspileNodes(node.Inner), " "))
|
||||||
case "var_def":
|
case "var_def":
|
||||||
res += fmt.Sprintf("var %s %s", TranspileNode(node.Inner[1]), TranspileNode(node.Inner[0]))
|
res += fmt.Sprintf("var %s %s", m.TranspileNode(node.Inner[1]), m.TranspileNode(node.Inner[0]))
|
||||||
case "round_def":
|
case "round_def":
|
||||||
res += fmt.Sprintf("(%s)", strings.TrimSuffix(strings.ReplaceAll(TranspileNodes(node.Inner), "var ", ""), " "))
|
res += fmt.Sprintf("(%s)", strings.TrimSuffix(strings.ReplaceAll(m.TranspileNodes(node.Inner), "var ", ""), " "))
|
||||||
case "call_tree":
|
case "call_tree":
|
||||||
for i, c := range node.Inner {
|
for i, c := range node.Inner {
|
||||||
res += TranspileNode(c)
|
res += m.TranspileNode(c)
|
||||||
if i+1 < len(node.Inner) {
|
if i+1 < len(node.Inner) {
|
||||||
res += "."
|
res += "."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case "fn_call":
|
case "fn_call":
|
||||||
res += TranspileNode(node.Inner[0])
|
res += m.TranspileNode(node.Inner[0])
|
||||||
res += TranspileNode(node.Inner[1])
|
res += m.TranspileNode(node.Inner[1])
|
||||||
|
|
||||||
case "round_call":
|
case "round_call":
|
||||||
res += fmt.Sprintf("(%s)", TranspileNodes(node.Inner))
|
res += fmt.Sprintf("(%s)", m.TranspileNodes(node.Inner))
|
||||||
|
|
||||||
case "struct_def":
|
case "struct_def":
|
||||||
res += fmt.Sprintf("type %s struct %s\n", TranspileNode(node.Inner[0]), TranspileNode(node.Inner[1]))
|
res += fmt.Sprintf("type %s struct %s\n", m.TranspileNode(node.Inner[0]), m.TranspileNode(node.Inner[1]))
|
||||||
|
|
||||||
case "enum_curly":
|
case "enum_curly":
|
||||||
res += fmt.Sprintf("{\n %s}", strings.TrimSuffix(TranspileNodes(node.Inner), " "))
|
res += fmt.Sprintf("{\n %s}", strings.TrimSuffix(m.TranspileNodes(node.Inner), " "))
|
||||||
|
|
||||||
case "namespace":
|
case "namespace":
|
||||||
namespace_name := "n" + TranspileNode(node.Inner[0])
|
namespace_name := "n" + m.TranspileNode(node.Inner[0])
|
||||||
res += fmt.Sprintf("type %s struct {\n ", namespace_name)
|
res += fmt.Sprintf("type %s struct {\n ", namespace_name)
|
||||||
vals := ""
|
vals := ""
|
||||||
for _, c := range node.Inner {
|
for _, c := range node.Inner {
|
||||||
if c.Rule == "var_def" {
|
if c.Rule == "var_def" {
|
||||||
res += strings.TrimPrefix(TranspileNode(c), "var ")
|
res += strings.TrimPrefix(m.TranspileNode(c), "var ")
|
||||||
res += "\n "
|
res += "\n "
|
||||||
} else if c.Rule == "var_def_set" {
|
} else if c.Rule == "var_def_set" {
|
||||||
res += strings.TrimPrefix(TranspileNode(c.Inner[0]), "var ")
|
res += strings.TrimPrefix(m.TranspileNode(c.Inner[0]), "var ")
|
||||||
res += "\n "
|
res += "\n "
|
||||||
vals += fmt.Sprintf("%s: %s, ", TranspileNode(c.Inner[0].Inner[1]), TranspileNode(c.Inner[1]))
|
vals += fmt.Sprintf("%s: %s, ", m.TranspileNode(c.Inner[0].Inner[1]), m.TranspileNode(c.Inner[1]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res += "}\n"
|
res += "}\n"
|
||||||
for _, c := range node.Inner {
|
for _, c := range node.Inner {
|
||||||
if c.Rule == "func_def" {
|
if c.Rule == "func_def" {
|
||||||
res += fmt.Sprintf("func (%s) %s%s %s %s", namespace_name, TranspileNode(c.Inner[1]), TranspileNode(c.Inner[2]), TranspileNode(c.Inner[0]), TranspileNode(c.Inner[3]))
|
return_type := m.TranspileNode(c.Inner[0])
|
||||||
|
if return_type == "void" {
|
||||||
|
return_type = ""
|
||||||
|
}
|
||||||
|
res += fmt.Sprintf("func (%s) %s%s %s %s", namespace_name, m.TranspileNode(c.Inner[1]), m.TranspileNode(c.Inner[2]), return_type, m.TranspileNode(c.Inner[3]))
|
||||||
res += "\n "
|
res += "\n "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res += fmt.Sprintf("var %s %s = %s{%s}", TranspileNode(node.Inner[0]), namespace_name, namespace_name, vals)
|
res += fmt.Sprintf("var %s %s = %s{%s}", m.TranspileNode(node.Inner[0]), namespace_name, namespace_name, vals)
|
||||||
|
|
||||||
case "var_def_set":
|
case "var_def_set":
|
||||||
res += fmt.Sprintf("%s = %s", TranspileNode(node.Inner[0]), TranspileNode(node.Inner[1]))
|
res += fmt.Sprintf("%s = %s", m.TranspileNode(node.Inner[0]), m.TranspileNode(node.Inner[1]))
|
||||||
|
|
||||||
case "import_statement":
|
case "import_statement":
|
||||||
res += fmt.Sprintf("import . \"%s\"\n", TranspileNode(node.Inner[0]))
|
res += fmt.Sprintf("import . \"%s\"\n", m.ImportModule(node.Inner[0].Text))
|
||||||
|
|
||||||
case "use_statement":
|
case "use_statement":
|
||||||
ident := strings.Split(TranspileNode(node.Inner[0]), ".")
|
ident := strings.Split(node.Inner[0].Text, ".")
|
||||||
res += fmt.Sprintf("import \"%s\"\n", ident[0])
|
modname := m.ImportModule(ident[0])
|
||||||
|
m := strings.Split(modname, "/")
|
||||||
|
res += fmt.Sprintf("import %s \"%s\"\n", m[len(m)-1], modname)
|
||||||
if len(ident) > 1 {
|
if len(ident) > 1 {
|
||||||
res += fmt.Sprintf("var %s = %s\n", ident[len(ident)-1], strings.Join(ident, "."))
|
res += fmt.Sprintf("var %s = %s\n", ident[len(ident)-1], strings.Join(ident, "."))
|
||||||
}
|
}
|
||||||
@@ -135,16 +141,16 @@ func TranspileNode(node ASTNode) string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func TranspileNodes(nodes []ASTNode) string {
|
func (m *Module) TranspileNodes(nodes []ASTNode) string {
|
||||||
res := ""
|
res := ""
|
||||||
for i := 0; i < len(nodes); i++ {
|
for i := 0; i < len(nodes); i++ {
|
||||||
res += TranspileNode(nodes[i])
|
res += m.TranspileNode(nodes[i])
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func Transpile(code string) string {
|
func (m *Module) Transpile(code string) string {
|
||||||
ast := Parse(code)
|
ast := Parse(code)
|
||||||
res := TranspileNodes(ast.Inner)
|
res := m.TranspileNodes(ast.Inner)
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
include io;
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user