Fixed numerous problems related to type parsing
This commit is contained in:
parent
5e2d8c9955
commit
16bca57e36
@ -24,27 +24,44 @@ func (parser *ParsingOperation) parseDataSection () (
|
|||||||
|
|
||||||
err = parser.nextToken(lexer.TokenKindColon)
|
err = parser.nextToken(lexer.TokenKindColon)
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
section.what, err = parser.parseType()
|
section.what, err = parser.parseType()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
|
if parser.token.Is(lexer.TokenKindNewline) {
|
||||||
|
// TODO: parse arguments
|
||||||
|
} else {
|
||||||
|
var argument Argument
|
||||||
|
argument, err = parser.parseArgument()
|
||||||
|
section.value = append(section.value, argument)
|
||||||
|
|
||||||
|
err = parser.expect(lexer.TokenKindNewline)
|
||||||
|
if err != nil { return }
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseType parses a type notation of the form Name, {Name}, etc.
|
// parseType parses a type notation of the form Name, {Name}, etc.
|
||||||
func (parser *ParsingOperation) parseType () (what Type, err error) {
|
func (parser *ParsingOperation) parseType () (what Type, err error) {
|
||||||
err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindLBrace)
|
err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace)
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
what.location = parser.token.Location()
|
what.location = parser.token.Location()
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindLBrace) {
|
if parser.token.Is(lexer.TokenKindLBrace) {
|
||||||
what.kind = TypeKindPointer
|
what.kind = TypeKindPointer
|
||||||
|
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
|
||||||
var points Type
|
var points Type
|
||||||
points, err = parser.parseType()
|
points, err = parser.parseType()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
what.points = &points
|
what.points = &points
|
||||||
|
|
||||||
err = parser.nextToken (
|
err = parser.expect (
|
||||||
lexer.TokenKindUInt,
|
lexer.TokenKindUInt,
|
||||||
lexer.TokenKindRBrace)
|
lexer.TokenKindRBrace)
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
@ -54,17 +71,16 @@ func (parser *ParsingOperation) parseType () (what Type, err error) {
|
|||||||
|
|
||||||
what.length = parser.token.Value().(uint64)
|
what.length = parser.token.Value().(uint64)
|
||||||
|
|
||||||
err = parser.nextToken (
|
err = parser.nextToken(lexer.TokenKindRBrace)
|
||||||
lexer.TokenKindUInt,
|
|
||||||
lexer.TokenKindRBrace)
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
what.name, err = parser.parseIdentifier()
|
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
}
|
}
|
||||||
|
|
||||||
err = parser.nextToken()
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
} else {
|
||||||
|
what.name, err = parser.parseIdentifier()
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindColon) {
|
if parser.token.Is(lexer.TokenKindColon) {
|
||||||
err = parser.nextToken(lexer.TokenKindName)
|
err = parser.nextToken(lexer.TokenKindName)
|
||||||
@ -80,6 +96,9 @@ func (parser *ParsingOperation) parseType () (what Type, err error) {
|
|||||||
file.ErrorKindError)
|
file.ErrorKindError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user