Merge pull request 'parser-cache' (#4) from parser-cache into main

Reviewed-on: arf/arf#4
This commit is contained in:
Sasha Koshka 2022-09-05 17:49:39 +00:00
commit c8181f93fa
4 changed files with 43 additions and 8 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 114 KiB

11
parser/cache.go Normal file
View File

@ -0,0 +1,11 @@
package parser
// cacheItem stores an item of the parser cache.
type cacheItem struct {
tree SyntaxTree
skimmed bool
}
// cache stores all modules that have been parsed so far. They are indexed with
// their full path on the filesystem, starting with '/'.
var cache = make(map[string] cacheItem)

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
// - rename this to Fetch
// * 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, skim bool) (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 && !(!skim && cached.skimmed){
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
}

View File

@ -1,12 +1,16 @@
package parser
import "io"
import "os"
import "strings"
import "testing"
// import "git.tebibyte.media/arf/arf/types"
import "path/filepath"
func checkTree (modulePath string, correct string, test *testing.T) {
tree, err := Parse(modulePath)
cwd, _ := os.Getwd()
modulePath = filepath.Join(cwd, modulePath)
println(modulePath)
tree, err := Fetch(modulePath, false)
treeString := tree.ToString(0)
treeRunes := []rune(treeString)