Created base for parser
The parser now handles file opening and invokes the lexer.
This commit is contained in:
		
							parent
							
								
									5a55c9ac87
								
							
						
					
					
						commit
						09170e390d
					
				
							
								
								
									
										18
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								main.go
									
									
									
									
									
								
							| @ -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
									
								
							
							
						
						
									
										49
									
								
								parser/parser.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										8
									
								
								parser/tree.go
									
									
									
									
									
										Normal 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 { | ||||
| 	 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user