data-section #3
							
								
								
									
										104
									
								
								parser/data.go
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								parser/data.go
									
									
									
									
									
								
							@ -1,9 +1,111 @@
 | 
				
			|||||||
package parser
 | 
					package parser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// parseData parses a data section
 | 
					import "git.tebibyte.media/sashakoshka/arf/file"
 | 
				
			||||||
 | 
					import "git.tebibyte.media/sashakoshka/arf/types"
 | 
				
			||||||
 | 
					import "git.tebibyte.media/sashakoshka/arf/lexer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// parseData parses a data section.
 | 
				
			||||||
func (parser *ParsingOperation) parseDataSection () (
 | 
					func (parser *ParsingOperation) parseDataSection () (
 | 
				
			||||||
	section *DataSection,
 | 
						section *DataSection,
 | 
				
			||||||
	err     error,
 | 
						err     error,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
 | 
						err = parser.expect(lexer.TokenKindName)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						section = &DataSection { location: parser.token.Location() }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = parser.nextToken(lexer.TokenKindPermission)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						section.permission = parser.token.Value().(types.Permission)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = parser.nextToken(lexer.TokenKindName)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						section.name = parser.token.Value().(string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = parser.nextToken(lexer.TokenKindColon)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						section.what, err = parser.parseType()
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// parseType parses a type notation of the form Name, {Name}, etc.
 | 
				
			||||||
 | 
					func (parser *ParsingOperation) parseType () (what Type, err error) {
 | 
				
			||||||
 | 
						err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindLBrace)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						what.location = parser.token.Location()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if parser.token.Is(lexer.TokenKindLBrace) {
 | 
				
			||||||
 | 
							what.kind = TypeKindPointer
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							var points Type
 | 
				
			||||||
 | 
							points, err = parser.parseType()
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
							what.points = &points
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = parser.nextToken (
 | 
				
			||||||
 | 
								lexer.TokenKindUInt,
 | 
				
			||||||
 | 
								lexer.TokenKindRBrace)
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if parser.token.Is(lexer.TokenKindUInt) {
 | 
				
			||||||
 | 
								what.kind = TypeKindArray
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								what.length = parser.token.Value().(uint64)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								err = parser.nextToken (
 | 
				
			||||||
 | 
									lexer.TokenKindUInt,
 | 
				
			||||||
 | 
									lexer.TokenKindRBrace)
 | 
				
			||||||
 | 
								if err != nil { return }
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							what.name, err = parser.parseIdentifier()
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = parser.nextToken()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if parser.token.Is(lexer.TokenKindColon) {
 | 
				
			||||||
 | 
							err = parser.nextToken(lexer.TokenKindName)
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qualifier := parser.token.Value().(string)
 | 
				
			||||||
 | 
							switch qualifier {
 | 
				
			||||||
 | 
							case "mut":
 | 
				
			||||||
 | 
								what.mutable = true
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								err = parser.token.NewError (
 | 
				
			||||||
 | 
									"unknown type qualifier \"" + qualifier + "\"",
 | 
				
			||||||
 | 
									file.ErrorKindError)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// parseIdentifier parses an identifier made out of dot separated names.
 | 
				
			||||||
 | 
					func (parser *ParsingOperation) parseIdentifier () (
 | 
				
			||||||
 | 
						identifier Identifier,
 | 
				
			||||||
 | 
						err        error,
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
						err = parser.expect(lexer.TokenKindName)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
						identifier.location = parser.token.Location()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							if !parser.token.Is(lexer.TokenKindName) { break }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							identifier.trail = append (
 | 
				
			||||||
 | 
								identifier.trail,
 | 
				
			||||||
 | 
								parser.token.Value().(string))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = parser.nextToken()
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if !parser.token.Is(lexer.TokenKindDot) { break }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -42,9 +42,9 @@ type Type struct {
 | 
				
			|||||||
	mutable bool
 | 
						mutable bool
 | 
				
			||||||
	kind TypeKind
 | 
						kind TypeKind
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// only applicable for arrays. a value of nil means it has an
 | 
						// only applicable for arrays. a value of zero means it has an
 | 
				
			||||||
	// undefined/dynamic length.
 | 
						// undefined/dynamic length.
 | 
				
			||||||
	length *Argument
 | 
						length uint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// only applicable for basic.
 | 
						// only applicable for basic.
 | 
				
			||||||
        name Identifier
 | 
					        name Identifier
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user