data-section #3
							
								
								
									
										76
									
								
								parser/argument.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								parser/argument.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					package parser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "git.tebibyte.media/sashakoshka/arf/file"
 | 
				
			||||||
 | 
					import "git.tebibyte.media/sashakoshka/arf/lexer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var validArgumentStartTokens = []lexer.TokenKind {
 | 
				
			||||||
 | 
						lexer.TokenKindName,
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						lexer.TokenKindInt,
 | 
				
			||||||
 | 
						lexer.TokenKindUInt,
 | 
				
			||||||
 | 
						lexer.TokenKindFloat,
 | 
				
			||||||
 | 
						lexer.TokenKindString,
 | 
				
			||||||
 | 
						lexer.TokenKindRune,
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						lexer.TokenKindLBrace,
 | 
				
			||||||
 | 
						lexer.TokenKindLBracket,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (parser *ParsingOperation) parseArgument () (argument Argument, err error) {
 | 
				
			||||||
 | 
						argument.location = parser.token.Location()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = parser.expect(validArgumentStartTokens...)
 | 
				
			||||||
 | 
						if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch parser.token.Kind() {
 | 
				
			||||||
 | 
						case lexer.TokenKindName:
 | 
				
			||||||
 | 
							var identifier Identifier
 | 
				
			||||||
 | 
							identifier, err = parser.parseIdentifier()
 | 
				
			||||||
 | 
							if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if parser.token.Is(lexer.TokenKindColon) {
 | 
				
			||||||
 | 
								var what Type
 | 
				
			||||||
 | 
								what, err = parser.parseType()
 | 
				
			||||||
 | 
								if err != nil { return }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if len(identifier.trail) != 1 {
 | 
				
			||||||
 | 
									err = parser.token.NewError (
 | 
				
			||||||
 | 
										"cannot use member selection in " +
 | 
				
			||||||
 | 
										"a variable definition",
 | 
				
			||||||
 | 
										file.ErrorKindError)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								argument.kind  = ArgumentKindDeclaration
 | 
				
			||||||
 | 
								argument.value = Declaration {
 | 
				
			||||||
 | 
									location: argument.location,
 | 
				
			||||||
 | 
									name:     identifier.trail[0],
 | 
				
			||||||
 | 
									what:     what,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								argument.kind  = ArgumentKindIdentifier
 | 
				
			||||||
 | 
								argument.value = identifier
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindInt:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindUInt:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindFloat:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindString:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindRune:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindLBrace:
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						case lexer.TokenKindLBracket:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic (
 | 
				
			||||||
 | 
								"unimplemented argument kind " +
 | 
				
			||||||
 | 
								parser.token.Kind().Describe())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user