57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package parser
|
|
|
|
import "os"
|
|
import "path/filepath"
|
|
import "git.tebibyte.media/sashakoshka/arf/file"
|
|
import "git.tebibyte.media/sashakoshka/arf/lexer"
|
|
|
|
// ParsingOperation holds information about an ongoing parsing operation.
|
|
type ParsingOperation struct {
|
|
modulePath string
|
|
token lexer.Token
|
|
tokens []lexer.Token
|
|
tokenIndex int
|
|
|
|
tree *SyntaxTree
|
|
}
|
|
|
|
// Parse reads the files located in the module specified by modulePath, and
|
|
// converts them into an abstract syntax tree.
|
|
func Parse (modulePath string) (tree *SyntaxTree, err error) {
|
|
parser := ParsingOperation { modulePath: modulePath }
|
|
err = parser.parse()
|
|
tree = parser.tree
|
|
return
|
|
}
|
|
|
|
// parse runs the parsing operation.
|
|
func (parser *ParsingOperation) parse () (err error) {
|
|
if parser.tree == nil {
|
|
parser.tree = &SyntaxTree { }
|
|
}
|
|
|
|
if parser.modulePath[len(parser.modulePath) - 1] != '/' {
|
|
parser.modulePath += "/"
|
|
}
|
|
|
|
var moduleFiles []os.DirEntry
|
|
moduleFiles, err = os.ReadDir(parser.modulePath)
|
|
if err != nil { return }
|
|
|
|
for _, entry := range moduleFiles {
|
|
if filepath.Ext(entry.Name()) != ".arf" || entry.IsDir() {
|
|
continue
|
|
}
|
|
|
|
var sourceFile *file.File
|
|
sourceFile, err = file.Open(parser.modulePath + entry.Name())
|
|
if err != nil { return }
|
|
|
|
var tokens []lexer.Token
|
|
tokens, err = lexer.Tokenize(sourceFile)
|
|
if err != nil { return }
|
|
parser.tokens = append(parser.tokens, tokens...)
|
|
}
|
|
return
|
|
}
|