organised stuff

This commit is contained in:
RudideC
2024-08-18 10:46:39 +02:00
parent 4ed12bc3f8
commit ab72951088
6 changed files with 12 additions and 9 deletions
+8
View File
@@ -0,0 +1,8 @@
package main
import "fmt"
func main() {
ast := Parse("abc123::hello")
fmt.Printf("%v", ast)
}
+53
View File
@@ -0,0 +1,53 @@
package main
import (
"github.com/antlr4-go/antlr/v4"
"github.com/wyst-lang/wyst/parser"
)
type ASTNode struct {
Rule string
Text string
Inner []ASTNode
}
func getTokenName(tokenType int, lexer *parser.WystLexer) string {
if tokenType >= 0 && tokenType < len(lexer.SymbolicNames) {
if lexer.SymbolicNames[tokenType] != "" {
return lexer.SymbolicNames[tokenType]
}
return lexer.LiteralNames[tokenType]
}
return "UNKNOWN"
}
func ConvertAST(node antlr.Tree, wparser *parser.WystParser, lexer *parser.WystLexer) ASTNode {
var ast = ASTNode{}
switch node := node.(type) {
case antlr.TerminalNode:
token := node.GetSymbol()
ast.Text = token.GetText()
ast.Rule = getTokenName(token.GetTokenType(), lexer)
default:
if ruleContext, ok := node.(antlr.RuleContext); ok {
ast.Rule = wparser.RuleNames[ruleContext.GetRuleIndex()]
}
if parseTree, ok := node.(antlr.ParseTree); ok {
ast.Text = parseTree.GetText()
}
for i := 0; i < node.GetChildCount(); i++ {
ast.Inner = append(ast.Inner, ConvertAST(node.GetChild(i), wparser, lexer))
}
}
return ast
}
func Parse(code string) ASTNode {
chars := antlr.NewInputStream(code)
lexer := parser.NewWystLexer(chars)
stream := antlr.NewCommonTokenStream(lexer, 0)
p := parser.NewWystParser(stream)
// p.AddErrorListener(antlr.NewDiagnosticErrorListener(true).WithContext(p))
tree := p.Expr()
return ConvertAST(tree, p, lexer)
}
+29
View File
@@ -0,0 +1,29 @@
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)))
}