module system

This commit is contained in:
2024-08-22 01:23:17 +02:00
parent 0da965ece3
commit 4672889a59
5 changed files with 46 additions and 50 deletions
+2
View File
@@ -25,3 +25,5 @@ go.work
.vscode .vscode
.antlr/ .antlr/
test/
+4 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
} }
-5
View File
@@ -1,5 +0,0 @@
include io;
void main() {
}