Added new token kind slices to func.go

This commit is contained in:
Sasha Koshka 2022-09-03 00:40:56 -04:00
parent 1f68f252e0
commit c2a8c4cd97

View File

@ -4,6 +4,40 @@ import "git.tebibyte.media/arf/arf/types"
import "git.tebibyte.media/arf/arf/lexer" import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr" import "git.tebibyte.media/arf/arf/infoerr"
// operatorTokens lists all symbolic tokens that can act as a command to a
// phrase.
var operatorTokens = []lexer.TokenKind {
lexer.TokenKindPlus,
lexer.TokenKindMinus,
lexer.TokenKindIncrement,
lexer.TokenKindDecrement,
lexer.TokenKindAsterisk,
lexer.TokenKindSlash,
lexer.TokenKindExclamation,
lexer.TokenKindPercent,
lexer.TokenKindPercentAssignment,
lexer.TokenKindTilde,
lexer.TokenKindTildeAssignment,
lexer.TokenKindEqualTo,
lexer.TokenKindNotEqualTo,
lexer.TokenKindLessThanEqualTo,
lexer.TokenKindLessThan,
lexer.TokenKindLShift,
lexer.TokenKindLShiftAssignment,
lexer.TokenKindGreaterThan,
lexer.TokenKindGreaterThanEqualTo,
lexer.TokenKindRShift,
lexer.TokenKindRShiftAssignment,
lexer.TokenKindBinaryOr,
lexer.TokenKindBinaryOrAssignment,
lexer.TokenKindLogicalOr,
lexer.TokenKindBinaryAnd,
lexer.TokenKindBinaryAndAssignment,
lexer.TokenKindLogicalAnd,
lexer.TokenKindBinaryXor,
lexer.TokenKindBinaryXorAssignment,
}
// validBlockLevelPhraseTokens lists all tokens that are expected when parsing // validBlockLevelPhraseTokens lists all tokens that are expected when parsing
// a block level phrase. // a block level phrase.
var validBlockLevelPhraseTokens = append ( var validBlockLevelPhraseTokens = append (
@ -11,15 +45,36 @@ var validBlockLevelPhraseTokens = append (
lexer.TokenKindNewline, lexer.TokenKindNewline,
lexer.TokenKindReturnDirection) lexer.TokenKindReturnDirection)
// validDelimitedBlockLevelPhraseTokens is like validBlockLevelPhraseTokens, but // validBlockLevelPhraseCommandTokens is like validBlockLevelPhraseTokens, but
// it also includes a right brace token. // specifically for the command argument.
var validDelimitedBlockLevelPhraseTokens = append ( var validBlockLevelPhraseCommandTokens = append (
validBlockLevelPhraseTokens,
operatorTokens...)
// validDelimitedPhraseTokens is like validBlockLevelPhraseTokens, but it also
// includes a right brace token.
var validDelimitedPhraseTokens = append (
validArgumentStartTokens, validArgumentStartTokens,
lexer.TokenKindNewline, lexer.TokenKindNewline,
lexer.TokenKindIndent, lexer.TokenKindIndent,
lexer.TokenKindRBracket, lexer.TokenKindRBracket,
lexer.TokenKindReturnDirection) lexer.TokenKindReturnDirection)
// validDelimitedPhraseCommandTokens is like validDelimitedPhraseTokens, but
// specifically for the command argument.
var validDelimitedPhraseCommand = append (
validDelimitedPhraseTokens,
operatorTokens...)
// controlFlowNames contains a list of all command names that must have a block
// underneath them.
var controlFlowNames = []string {
"if", "else", "elseif",
"for", "while",
"switch",
"defer",
}
// parseFunc parses a function section. // parseFunc parses a function section.
func (parser *ParsingOperation) parseFuncSection () ( func (parser *ParsingOperation) parseFuncSection () (
section *FuncSection, section *FuncSection,
@ -271,7 +326,7 @@ func (parser *ParsingOperation) parseBlockLevelPhrase (
if expectRightBracket { if expectRightBracket {
// delimited // delimited
// [someFunc arg1 arg2 arg3] -> someVariable // [someFunc arg1 arg2 arg3] -> someVariable
err = parser.expect(validDelimitedBlockLevelPhraseTokens...) err = parser.expect(validDelimitedPhraseTokens...)
if err != nil { return } if err != nil { return }
if parser.token.Is(lexer.TokenKindRBracket) { if parser.token.Is(lexer.TokenKindRBracket) {
@ -347,7 +402,7 @@ func (parser *ParsingOperation) parseArgumentLevelPhrase () (
for { for {
// delimited // delimited
// [someFunc arg1 arg2 arg3] -> someVariable // [someFunc arg1 arg2 arg3] -> someVariable
err = parser.expect(validDelimitedBlockLevelPhraseTokens...) err = parser.expect(validDelimitedPhraseTokens...)
if err != nil { return } if err != nil { return }
if parser.token.Is(lexer.TokenKindRBracket) { if parser.token.Is(lexer.TokenKindRBracket) {