The section kind specific maps are gone
I've REPLACED IT with the unified sections map. Interfaces, baby!
This commit is contained in:
parent
9269161138
commit
f3c72f8f30
@ -11,73 +11,43 @@ func (parser *ParsingOperation) parseBody () (err error) {
|
|||||||
err = parser.expect(lexer.TokenKindName)
|
err = parser.expect(lexer.TokenKindName)
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
sectionType := parser.token.Value().(string)
|
sectionType := parser.token.Value().(string)
|
||||||
|
|
||||||
switch sectionType {
|
switch sectionType {
|
||||||
case "data":
|
case "data":
|
||||||
var section *DataSection
|
section, parseErr := parser.parseDataSection()
|
||||||
section, err = parser.parseDataSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.dataSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.dataSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *DataSection)
|
|
||||||
}
|
|
||||||
parser.tree.dataSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
case "type":
|
case "type":
|
||||||
var section *TypeSection
|
section, parseErr := parser.parseTypeSection()
|
||||||
section, err = parser.parseTypeSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.typeSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.typeSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *TypeSection)
|
|
||||||
}
|
|
||||||
parser.tree.typeSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
case "objt":
|
case "objt":
|
||||||
var section *ObjtSection
|
section, parseErr := parser.parseObjtSection()
|
||||||
section, err = parser.parseObjtSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.objtSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.objtSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *ObjtSection)
|
|
||||||
}
|
|
||||||
parser.tree.objtSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
case "face":
|
case "face":
|
||||||
var section *FaceSection
|
section, parseErr := parser.parseFaceSection()
|
||||||
section, err = parser.parseFaceSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.faceSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.faceSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *FaceSection)
|
|
||||||
}
|
|
||||||
parser.tree.faceSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
case "enum":
|
case "enum":
|
||||||
var section *EnumSection
|
section, parseErr := parser.parseEnumSection()
|
||||||
section, err = parser.parseEnumSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.enumSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.enumSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *EnumSection)
|
|
||||||
}
|
|
||||||
parser.tree.enumSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
case "func":
|
case "func":
|
||||||
var section *FuncSection
|
section, parseErr := parser.parseFuncSection()
|
||||||
section, err = parser.parseFuncSection()
|
err = parser.tree.addSection(section)
|
||||||
if parser.tree.funcSections == nil {
|
if err != nil { return }
|
||||||
parser.tree.funcSections =
|
if parseErr != nil { return }
|
||||||
make(map[string] *FuncSection)
|
|
||||||
}
|
|
||||||
parser.tree.funcSections[section.name] = section
|
|
||||||
parser.tree.sections[section.name] = section
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err = parser.token.NewError (
|
err = parser.token.NewError (
|
||||||
@ -87,3 +57,18 @@ func (parser *ParsingOperation) parseBody () (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// addSection adds a section to the tree, ensuring it has a unique name within
|
||||||
|
// the module.
|
||||||
|
func (tree *SyntaxTree) addSection (section Section) (err error) {
|
||||||
|
_, exists := tree.sections[section.Name()]
|
||||||
|
if exists {
|
||||||
|
err = section.NewError (
|
||||||
|
"cannot have multiple sections with the same name",
|
||||||
|
infoerr.ErrorKindError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tree.sections[section.Name()] = section
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -20,7 +20,7 @@ func (trait locatable) NewError (
|
|||||||
message string,
|
message string,
|
||||||
kind infoerr.ErrorKind,
|
kind infoerr.ErrorKind,
|
||||||
) (
|
) (
|
||||||
err infoerr.Error,
|
err error,
|
||||||
) {
|
) {
|
||||||
err = infoerr.NewError(trait.location, message, kind)
|
err = infoerr.NewError(trait.location, message, kind)
|
||||||
return
|
return
|
||||||
|
@ -20,7 +20,12 @@ type ParsingOperation struct {
|
|||||||
// Parse reads the files located in the module specified by modulePath, and
|
// Parse reads the files located in the module specified by modulePath, and
|
||||||
// converts them into an abstract syntax tree.
|
// converts them into an abstract syntax tree.
|
||||||
func Parse (modulePath string) (tree *SyntaxTree, err error) {
|
func Parse (modulePath string) (tree *SyntaxTree, err error) {
|
||||||
parser := ParsingOperation { modulePath: modulePath }
|
parser := ParsingOperation {
|
||||||
|
modulePath: modulePath,
|
||||||
|
tree: &SyntaxTree {
|
||||||
|
sections: make(map[string] Section),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
if parser.modulePath[len(parser.modulePath) - 1] != '/' {
|
if parser.modulePath[len(parser.modulePath) - 1] != '/' {
|
||||||
parser.modulePath += "/"
|
parser.modulePath += "/"
|
||||||
@ -54,9 +59,6 @@ func (parser *ParsingOperation) parse (sourceFile *file.File) (err error) {
|
|||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
// reset the parser
|
// reset the parser
|
||||||
if parser.tree == nil {
|
|
||||||
parser.tree = &SyntaxTree { }
|
|
||||||
}
|
|
||||||
if len(tokens) == 0 { return }
|
if len(tokens) == 0 { return }
|
||||||
parser.tokens = tokens
|
parser.tokens = tokens
|
||||||
parser.token = tokens[0]
|
parser.token = tokens[0]
|
||||||
|
@ -47,35 +47,11 @@ func (tree *SyntaxTree) ToString (indent int) (output string) {
|
|||||||
|
|
||||||
output += doIndent(indent, "---\n")
|
output += doIndent(indent, "---\n")
|
||||||
|
|
||||||
typeSectionKeys := sortMapKeysAlphabetically(tree.typeSections)
|
sectionKeys := sortMapKeysAlphabetically(tree.sections)
|
||||||
for _, name := range typeSectionKeys {
|
for _, name := range sectionKeys {
|
||||||
output += tree.typeSections[name].ToString(indent)
|
output += tree.sections[name].ToString(indent)
|
||||||
}
|
}
|
||||||
|
|
||||||
objtSectionKeys := sortMapKeysAlphabetically(tree.objtSections)
|
|
||||||
for _, name := range objtSectionKeys {
|
|
||||||
output += tree.objtSections[name].ToString(indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
enumSectionKeys := sortMapKeysAlphabetically(tree.enumSections)
|
|
||||||
for _, name := range enumSectionKeys {
|
|
||||||
output += tree.enumSections[name].ToString(indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
faceSectionKeys := sortMapKeysAlphabetically(tree.faceSections)
|
|
||||||
for _, name := range faceSectionKeys {
|
|
||||||
output += tree.faceSections[name].ToString(indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSectionKeys := sortMapKeysAlphabetically(tree.dataSections)
|
|
||||||
for _, name := range dataSectionKeys {
|
|
||||||
output += tree.dataSections[name].ToString(indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
funcSectionKeys := sortMapKeysAlphabetically(tree.funcSections)
|
|
||||||
for _, name := range funcSectionKeys {
|
|
||||||
output += tree.funcSections[name].ToString(indent)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package parser
|
|||||||
|
|
||||||
import "git.tebibyte.media/arf/arf/file"
|
import "git.tebibyte.media/arf/arf/file"
|
||||||
import "git.tebibyte.media/arf/arf/types"
|
import "git.tebibyte.media/arf/arf/types"
|
||||||
|
import "git.tebibyte.media/arf/arf/infoerr"
|
||||||
|
|
||||||
// SyntaxTree represents an abstract syntax tree. It covers an entire module. It
|
// 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
|
// can be expected to be syntactically correct, but it might not be semantically
|
||||||
@ -12,13 +13,6 @@ type SyntaxTree struct {
|
|||||||
|
|
||||||
requires []string
|
requires []string
|
||||||
sections map[string] Section
|
sections map[string] Section
|
||||||
|
|
||||||
typeSections map[string] *TypeSection
|
|
||||||
objtSections map[string] *ObjtSection
|
|
||||||
enumSections map[string] *EnumSection
|
|
||||||
faceSections map[string] *FaceSection
|
|
||||||
dataSections map[string] *DataSection
|
|
||||||
funcSections map[string] *FuncSection
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SectionKind differentiates Section interfaces.
|
// SectionKind differentiates Section interfaces.
|
||||||
@ -40,6 +34,8 @@ type Section interface {
|
|||||||
Kind () (kind SectionKind)
|
Kind () (kind SectionKind)
|
||||||
Permission () (permission types.Permission)
|
Permission () (permission types.Permission)
|
||||||
Name () (name string)
|
Name () (name string)
|
||||||
|
NewError (message string, kind infoerr.ErrorKind) (err error)
|
||||||
|
ToString (indent int) (output string)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Identifier represents a chain of arguments separated by a dot.
|
// Identifier represents a chain of arguments separated by a dot.
|
||||||
|
Reference in New Issue
Block a user