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.
type cacheItem struct {
section Section
tree SyntaxTree
skimmed bool
}

View File

@ -18,15 +18,28 @@ type ParsingOperation struct {
}
// TODO:
// - implement parser cache
// - have this try to hit the cache, and actually parse on miss
// * implement parser cache
// * have this try to hit the cache, and actually parse on miss
// - rename this to Fetch
// - add `skim bool` argument. when this is true, don't parse any code or data
// section initialization values, just definitions and their default values.
// 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) {
// Fetch returns the parsed module located at the specified path, and returns an
// abstract syntax tree. If the module has not yet been parsed, it parses it
// 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 {
modulePath: modulePath,
tree: SyntaxTree {
@ -56,6 +69,13 @@ func Parse (modulePath string) (tree SyntaxTree, err error) {
}
tree = parser.tree
// cache tree
cache[modulePath] = cacheItem {
tree: tree,
skimmed: false,
}
return
}