Parse -> Fetch, now tries to hit cache

This commit is contained in:
Sasha Koshka 2022-09-05 13:31:38 -04:00
parent a791063d5b
commit 2e79d9c834
2 changed files with 26 additions and 6 deletions

View File

@ -2,7 +2,7 @@ package parser
// cacheItem stores an item of the parser cache. // cacheItem stores an item of the parser cache.
type cacheItem struct { type cacheItem struct {
section Section tree SyntaxTree
skimmed bool skimmed bool
} }

View File

@ -18,15 +18,28 @@ type ParsingOperation struct {
} }
// TODO: // TODO:
// - implement parser cache // * implement parser cache
// - have this try to hit the cache, and actually parse on miss // * have this try to hit the cache, and actually parse on miss
// - rename this to Fetch // - rename this to Fetch
// - add `skim bool` argument. when this is true, don't parse any code or data // - add `skim bool` argument. when this is true, don't parse any code or data
// section initialization values, just definitions and their default values. // section initialization values, just definitions and their default values.
// Parse reads the files located in the module specified by modulePath, and // Fetch returns the parsed module located at the specified path, and returns an
// converts them into an abstract syntax tree. // abstract syntax tree. If the module has not yet been parsed, it parses it
func Parse (modulePath string) (tree SyntaxTree, err error) { // first.
func Fetch (modulePath string) (tree SyntaxTree, err error) {
if modulePath[0] != '/' {
panic("module path did not begin at filesystem root")
}
// try to hit cache
cached, exists := cache[modulePath]
if exists {
tree = cached.tree
return
}
// miss, so parse the module.
parser := ParsingOperation { parser := ParsingOperation {
modulePath: modulePath, modulePath: modulePath,
tree: SyntaxTree { tree: SyntaxTree {
@ -56,6 +69,13 @@ func Parse (modulePath string) (tree SyntaxTree, err error) {
} }
tree = parser.tree tree = parser.tree
// cache tree
cache[modulePath] = cacheItem {
tree: tree,
skimmed: false,
}
return return
} }