type-section-rework #6
@ -2,6 +2,7 @@ package parser
|
||||
|
||||
import "git.tebibyte.media/arf/arf/lexer"
|
||||
import "git.tebibyte.media/arf/arf/infoerr"
|
||||
import "git.tebibyte.media/arf/arf/types"
|
||||
|
||||
// parseType parses a type notation of the form Name, {Name}, etc.
|
||||
func (parser *ParsingOperation) parseType () (what Type, err error) {
|
||||
@ -153,7 +154,7 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () (
|
||||
var memberValue Argument
|
||||
|
||||
memberName,
|
||||
memberValue, err = parser.parseObjectMemberDefinition()
|
||||
memberValue, err = parser.parseObjectInheritedMember()
|
||||
if err != nil { return }
|
||||
|
||||
if value.kind == ArgumentKindNil {
|
||||
@ -173,8 +174,9 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () (
|
||||
// parsing a member declaration
|
||||
var member TypeMember
|
||||
member,
|
||||
err = parser.parseObjectMemberDeclaration()
|
||||
err = parser.parseObjectNewMember()
|
||||
|
||||
// TODO: error on duplicate
|
||||
members = append(members, member)
|
||||
}
|
||||
}
|
||||
@ -216,7 +218,7 @@ func (parser *ParsingOperation) parseObjectDefaultValue () (
|
||||
var memberName string
|
||||
var memberValue Argument
|
||||
memberName,
|
||||
memberValue, err = parser.parseObjectMemberDefinition()
|
||||
memberValue, err = parser.parseObjectInheritedMember()
|
||||
|
||||
attributes[memberName] = memberValue
|
||||
}
|
||||
@ -224,22 +226,22 @@ func (parser *ParsingOperation) parseObjectDefaultValue () (
|
||||
return
|
||||
}
|
||||
|
||||
// .ro name:Type:qualifier:<value>
|
||||
// .name:<value>
|
||||
|
||||
// parseObjectMemberDefinition parses a new default value for an inherited
|
||||
// parseObjectInheritedMember parses a new default value for an inherited
|
||||
// member.
|
||||
func (parser *ParsingOperation) parseObjectMemberDefinition () (
|
||||
func (parser *ParsingOperation) parseObjectInheritedMember () (
|
||||
name string,
|
||||
value Argument,
|
||||
err error,
|
||||
) {
|
||||
// get the name of the inherited member
|
||||
err = parser.expect(lexer.TokenKindName)
|
||||
value.location = parser.token.Location()
|
||||
if err != nil { return }
|
||||
name = parser.token.Value().(string)
|
||||
|
||||
// we require a default value, or else why would this structure even be
|
||||
// present?
|
||||
// we require a default value to be present
|
||||
err = parser.nextToken(lexer.TokenKindColon)
|
||||
if err != nil { return }
|
||||
err = parser.nextToken(lexer.TokenKindLParen, lexer.TokenKindLessThan)
|
||||
@ -259,15 +261,29 @@ func (parser *ParsingOperation) parseObjectMemberDefinition () (
|
||||
return
|
||||
}
|
||||
|
||||
// .name:<value>
|
||||
// .ro name:Type:qualifier:<value>
|
||||
|
||||
// parseObjectMemberDeclaration parses an object member declaration, and its
|
||||
// parseObjectNewMember parses an object member declaration, and its
|
||||
// default value if it exists.
|
||||
func (parser *ParsingOperation) parseObjectMemberDeclaration () (
|
||||
func (parser *ParsingOperation) parseObjectNewMember () (
|
||||
member TypeMember,
|
||||
err error,
|
||||
) {
|
||||
// get member permission
|
||||
err = parser.expect(lexer.TokenKindPermission)
|
||||
member.location = parser.token.Location()
|
||||
if err != nil { return }
|
||||
member.permission = parser.token.Value().(types.Permission)
|
||||
|
||||
// get member name
|
||||
err = parser.nextToken(lexer.TokenKindName)
|
||||
if err != nil { return }
|
||||
member.name = parser.token.Value().(string)
|
||||
|
||||
// get type
|
||||
err = parser.nextToken(lexer.TokenKindColon)
|
||||
if err != nil { return }
|
||||
member.what, err = parser.parseType()
|
||||
if err != nil { return }
|
||||
|
||||
return
|
||||
|
Reference in New Issue
Block a user