diff --git a/analyzer/analyzer.go b/analyzer/analyzer.go index 08fe42e..b47bd23 100644 --- a/analyzer/analyzer.go +++ b/analyzer/analyzer.go @@ -58,7 +58,7 @@ func (analyzer *analysisOperation) analyze () (err error) { for !sections.End() { _, err = analyzer.fetchSection(locator { modulePath: analyzer.modulePath, - name: sections.Value().Name(), + name: sections.Key(), }) if err != nil { return err } sections.Next() @@ -93,7 +93,7 @@ func (analyzer *analysisOperation) fetchSection ( return } - var parsedSection = tree.LookupSection(where.name) + var parsedSection = tree.LookupSection("", where.name) if parsedSection == nil { section = nil return diff --git a/analyzer/block.go b/analyzer/block.go index dc76ed0..1e47aa4 100644 --- a/analyzer/block.go +++ b/analyzer/block.go @@ -1,5 +1,31 @@ package analyzer +import "git.tebibyte.media/arf/arf/parser" + +// Block represents a scoped block of phrases. type Block struct { locatable + phrases []Phrase + + // TODO: create a scope struct and embed it +} + +func (block Block) ToString (indent int) (output string) { + output += doIndent(indent, "block\n") + + // TODO: variables + // TODO: phrases + return +} + +// analyzeBlock analyzes a scoped block of phrases. +// TODO: have a way to "start out" with a list of variables for things like +// arguments, and declarations inside of control flow statements +func (analyzer *analysisOperation) analyzeBlock ( + inputBlock parser.Block, +) ( + block Block, + err error, +) { + return } diff --git a/analyzer/func-section.go b/analyzer/func-section.go index c119000..e51b16f 100644 --- a/analyzer/func-section.go +++ b/analyzer/func-section.go @@ -7,7 +7,8 @@ import "git.tebibyte.media/arf/arf/infoerr" // FuncSection represents a type definition section. type FuncSection struct { sectionBase - external bool + root Block + external bool } // ToString returns all data stored within the function section, in string form. @@ -18,7 +19,7 @@ func (section FuncSection) ToString (indent int) (output string) { output += "\n" // TODO: arguments - // TODO: root block + output += section.root.ToString(indent + 1) return } @@ -53,6 +54,8 @@ func (analyzer *analysisOperation) analyzeFuncSection () ( outputSection.external = true } else { + outputSection.root, err = analyzer.analyzeBlock(inputSection.Root()) + if err != nil { return } // TODO: analyze root block if not nil } diff --git a/parser/accessors.go b/parser/accessors.go index 4c21e0b..7af447d 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -5,7 +5,15 @@ import "git.tebibyte.media/arf/arf/types" // LookupSection looks returns the section under the give name. If the section // does not exist, nil is returned. If a method is being searched for, the type // name of its receiver should be passed. If not, it should just be left blank. -func (tree SyntaxTree) LookupSection (name string) (section Section) { +func (tree SyntaxTree) LookupSection ( + receiver string, + name string, +) ( + section Section, +) { + if receiver != "" { + name = receiver + "_" + name + } section = tree.sections[name] return }