Created base for parser

The parser now handles file opening and invokes the lexer.
This commit is contained in:
Sasha Koshka 2022-08-12 10:11:43 -05:00
parent 5a55c9ac87
commit 09170e390d
3 changed files with 59 additions and 16 deletions

18
main.go
View File

@ -1,23 +1,9 @@
package arf
import "os"
import "io"
import "path/filepath"
// import "github.com/sashakoshka/arf/lexer"
import "github.com/sashakoshka/arf/parser"
func CompileModule (modulePath string, output io.Writer) (err error) {
moduleFiles, err := os.ReadDir(modulePath)
if err != nil { return err }
// var moduleTokens []lexer.Token
for _, entry := range moduleFiles {
if filepath.Ext(entry.Name()) != ".arf" || entry.IsDir() {
continue
}
// tokens, err := lexer.Tokenize()
// if err != nil { return err }
}
_, err = parser.Parse(modulePath)
return
}

49
parser/parser.go Normal file
View File

@ -0,0 +1,49 @@
package parser
import "os"
import "path/filepath"
import "github.com/sashakoshka/arf/file"
import "github.com/sashakoshka/arf/lexer"
// ParsingOperation holds information about an ongoing parsing operation.
type ParsingOperation struct {
modulePath string
token lexer.Token
tokens []lexer.Token
tokenIndex int
}
// 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 }
tree, err = parser.parse()
return
}
// parse runs the parsing operation.
func (parser *ParsingOperation) parse () (tree *SyntaxTree, err error) {
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
}

8
parser/tree.go Normal file
View File

@ -0,0 +1,8 @@
package parser
// SyntaxTree represents an abstract syntax tree. It covers an entire module. It
// can be expected to be syntactically correct, but it might not be semantically
// correct (because it has not been analyzed yet.)
type SyntaxTree struct {
}