From bf32256ff3014543ef5dda69c4ee1e94d01361fe Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 24 Jul 2023 14:19:42 +0200 Subject: parser: define all node kinds to make the parser multi-language (#3) * parser: define all node kinds to make the parser multi-language Defining all AST node kinds in the parser is necessary to make the parser really multi-language. If a language requires a node kind not already present in parser/kind.go, it will be necessary to add it first here. Note that as long as a node kind subtree is structurally identical between languages, even if there are lexical and/or syntaxic differences, it can (and must) be shared amongst multiple language definitions. For example, an "if" statememt in shell script or in C code should give the same `IfStmt` at AST level. In order to let the parser deal with the various language syntaxes, and produce the right node kind and subtree, parser flags will be set in language definitions (see `Flags` field in `NodeSpec` struct). * lang/golang: use parser node kinds * vm0: remode dependency on language definition. --- parser/kind.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ parser/node.go | 2 -- parser/parse_test.go | 17 ----------------- 3 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 parser/kind.go (limited to 'parser') diff --git a/parser/kind.go b/parser/kind.go new file mode 100644 index 0000000..d570358 --- /dev/null +++ b/parser/kind.go @@ -0,0 +1,52 @@ +package parser + +import "fmt" + +type Kind int + +const ( + Undefined = Kind(iota) + FuncDecl + CallExpr + IfStmt + StmtBloc + ReturnStmt + Ident + StringLit + NumberLit + ParBloc + DotOp + MulOp + AddOp + SubOp + AssignOp + DefOp + InfOp +) + +var kindString = [...]string{ + Undefined: "Undefined", + FuncDecl: "FuncDecl", + CallExpr: "CallExpr", + IfStmt: "IfStmt", + StmtBloc: "StmtBloc", + ReturnStmt: "ReturnStmt", + Ident: "Ident", + StringLit: "StringLit", + NumberLit: "NumberLit", + ParBloc: "ParBloc", + DotOp: "DotOp", + MulOp: "MulOp", + AddOp: "AddOP", + SubOp: "SubOp", + AssignOp: "AssignOp", + DefOp: "DefOp", + InfOp: "InfOp", +} + +func (k Kind) String() string { + if int(k) < 0 || int(k) > len(kindString) { + return fmt.Sprintf("unknown kind %d", k) + } + return kindString[k] +} diff --git a/parser/node.go b/parser/node.go index 6ebc2a7..f81285a 100644 --- a/parser/node.go +++ b/parser/node.go @@ -2,8 +2,6 @@ package parser import "github.com/gnolang/parscan/scanner" -type Kind int - type Node struct { Child []*Node // sub-tree nodes scanner.Token // token at origin of the node diff --git a/parser/parse_test.go b/parser/parse_test.go index dc363cb..3bf6955 100644 --- a/parser/parse_test.go +++ b/parser/parse_test.go @@ -47,23 +47,6 @@ var GoScanner = &scanner.Scanner{ }, } -const ( - Undefined = Kind(iota) - FuncDecl - CallExpr - IfStmt - StmtBloc - ReturnStmt - ParBloc - MulOp - AddOp - SubOp - DotOp - AssignOp - DefOp - InfOp -) - var GoParser = &Parser{ Scanner: GoScanner, Spec: map[string]NodeSpec{ -- cgit v1.2.3