This repository has been archived on 2024-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
arf/parser/argument.go

99 lines
2.4 KiB
Go
Raw Permalink Normal View History

package parser
2022-08-30 05:11:10 +00:00
import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr"
var validArgumentStartTokens = []lexer.TokenKind {
lexer.TokenKindName,
lexer.TokenKindInt,
lexer.TokenKindUInt,
lexer.TokenKindFloat,
lexer.TokenKindString,
lexer.TokenKindLBracket,
2022-10-11 15:31:44 +00:00
lexer.TokenKindLBrace,
2022-09-27 22:03:27 +00:00
lexer.TokenKindLParen,
}
2022-10-12 03:57:27 +00:00
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) {
err = parser.nextToken()
if err != nil { return }
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",
infoerr.ErrorKindError)
return
}
declaration := Declaration { }
declaration.what = what
declaration.name = identifier.trail[0]
declaration.location = argument.Location()
argument.kind = ArgumentKindDeclaration
argument.value = declaration
} else {
argument.kind = ArgumentKindIdentifier
argument.value = identifier
}
case lexer.TokenKindInt:
2022-08-16 20:27:52 +00:00
argument.kind = ArgumentKindInt
argument.value = parser.token.Value().(int64)
err = parser.nextToken()
case lexer.TokenKindUInt:
2022-08-16 20:27:52 +00:00
argument.kind = ArgumentKindUInt
argument.value = parser.token.Value().(uint64)
err = parser.nextToken()
case lexer.TokenKindFloat:
2022-08-16 20:27:52 +00:00
argument.kind = ArgumentKindFloat
argument.value = parser.token.Value().(float64)
err = parser.nextToken()
case lexer.TokenKindString:
2022-08-16 20:27:52 +00:00
argument.kind = ArgumentKindString
argument.value = parser.token.Value().(string)
parser.nextToken()
2022-09-03 02:43:48 +00:00
case lexer.TokenKindLBracket:
2022-10-11 15:31:44 +00:00
argument.kind = ArgumentKindPhrase
argument.value, err = parser.parseArgumentLevelPhrase()
2022-10-11 15:31:44 +00:00
case lexer.TokenKindLBrace:
argument.kind = ArgumentKindDereference
argument.value, err = parser.parseDereference()
2022-09-27 22:03:27 +00:00
case lexer.TokenKindLParen:
argument.kind = ArgumentKindList
argument.value, err = parser.parseList()
default:
panic (
"unimplemented argument kind " +
parser.token.Kind().Describe())
}
return
}