Lobbotomized the codebase
This commit is contained in:
parent
21ea27791d
commit
767bf81b85
@ -35,39 +35,16 @@ func (parser *ParsingOperation) parseDataSection () (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
// check if data is external
|
||||||
err = parser.nextToken()
|
if parser.token.Is(lexer.TokenKindName) &&
|
||||||
if err != nil { return }
|
parser.token.Value().(string) == "external" {
|
||||||
|
|
||||||
// check if external
|
section.external = true
|
||||||
if !parser.token.Is(lexer.TokenKindIndent) { return }
|
err = parser.nextToken(lexer.TokenKindNewline)
|
||||||
if parser.token.Value().(int) != 1 { return }
|
|
||||||
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
if parser.token.Is(lexer.TokenKindName) &&
|
|
||||||
parser.token.Value().(string) == "external" {
|
|
||||||
|
|
||||||
section.external = true
|
|
||||||
err = parser.nextToken(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, parse initialization values
|
|
||||||
parser.previousToken()
|
|
||||||
section.value, err = parser.parseDefaultValues(0)
|
|
||||||
if err != nil { return }
|
|
||||||
} else {
|
|
||||||
section.value, err = parser.parseArgument()
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
err = parser.expect(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
err = parser.nextToken()
|
err = parser.nextToken()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
180
parser/default-values.go
Normal file
180
parser/default-values.go
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package parser
|
||||||
|
//
|
||||||
|
// import "git.tebibyte.media/arf/arf/lexer"
|
||||||
|
// import "git.tebibyte.media/arf/arf/infoerr"
|
||||||
|
//
|
||||||
|
// // TODO:
|
||||||
|
// // (parser *ParsingOperation) parseDefaultValues
|
||||||
|
//
|
||||||
|
// // (parser *ParsingOperation) parseDefaultMemberValues (return tree of new members and a tree of member values)
|
||||||
|
// // (parser *ParsingOperation) parseDefaultArrayValues
|
||||||
|
//
|
||||||
|
// // (parser *ParsingOperation) parseDefaultMemberValue
|
||||||
|
// // (parser *ParsingOperation) parseMemberDeclaration
|
||||||
|
//
|
||||||
|
// // parsedefaultValues starts on the line after a = phrase, a data section, a
|
||||||
|
// // type section, or anywhere else where there can be a default value. It returns
|
||||||
|
// // a default value in the form of an argument, as well as any defined members
|
||||||
|
// // that it finds.
|
||||||
|
// func (parser *ParsingOperation) parseDefaultValues (
|
||||||
|
// baseIndent int,
|
||||||
|
// ) (
|
||||||
|
// argument Argument,
|
||||||
|
// members []TypeMember,
|
||||||
|
// err error,
|
||||||
|
// ) {
|
||||||
|
// // check if line is indented one more than baseIndent
|
||||||
|
// if !parser.token.Is(lexer.TokenKindIndent) { return }
|
||||||
|
// if parser.token.Value().(int) != baseIndent + 1 { return }
|
||||||
|
//
|
||||||
|
// argument.location = parser.token.Location()
|
||||||
|
//
|
||||||
|
// err = parser.nextToken()
|
||||||
|
// if err != nil { return }
|
||||||
|
//
|
||||||
|
// if parser.token.Is(lexer.TokenKindDot) {
|
||||||
|
//
|
||||||
|
// // object initialization
|
||||||
|
// parser.previousToken()
|
||||||
|
// var values ObjectDefaultValues
|
||||||
|
// values, err = parser.parseObjectdefaultValues()
|
||||||
|
// argument.kind = ArgumentKindObjectDefaultValues
|
||||||
|
// argument.value = values
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
|
//
|
||||||
|
// // array initialization
|
||||||
|
// parser.previousToken()
|
||||||
|
// var values ArrayDefaultValues
|
||||||
|
// values, err = parser.parseArrayDefaultValues()
|
||||||
|
// argument.kind = ArgumentKindArrayDefaultValues
|
||||||
|
// argument.value = values
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // parseObjectdefaultValues parses a list of object initialization
|
||||||
|
// // values until the indentation level drops.
|
||||||
|
// func (parser *ParsingOperation) parseObjectdefaultValues () (
|
||||||
|
// defaultValues ObjectDefaultValues,
|
||||||
|
// err error,
|
||||||
|
// ) {
|
||||||
|
// defaultValues.attributes = make(map[string] Argument)
|
||||||
|
//
|
||||||
|
// baseIndent := 0
|
||||||
|
// begin := true
|
||||||
|
//
|
||||||
|
// for {
|
||||||
|
// // if there is no indent we can just stop parsing
|
||||||
|
// if !parser.token.Is(lexer.TokenKindIndent) { break}
|
||||||
|
// indent := parser.token.Value().(int)
|
||||||
|
//
|
||||||
|
// if begin == true {
|
||||||
|
// defaultValues.location = parser.token.Location()
|
||||||
|
// baseIndent = indent
|
||||||
|
// begin = false
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // do not parse any further if the indent has changed
|
||||||
|
// if indent != baseIndent { break }
|
||||||
|
//
|
||||||
|
// // move on to the beginning of the line, which must contain
|
||||||
|
// // a member initialization value
|
||||||
|
// err = parser.nextToken(lexer.TokenKindDot)
|
||||||
|
// if err != nil { return }
|
||||||
|
// err = parser.nextToken(lexer.TokenKindName)
|
||||||
|
// if err != nil { return }
|
||||||
|
// name := parser.token.Value().(string)
|
||||||
|
//
|
||||||
|
// // if the member has already been listed, throw an error
|
||||||
|
// _, exists := defaultValues.attributes[name]
|
||||||
|
// if exists {
|
||||||
|
// err = parser.token.NewError (
|
||||||
|
// "duplicate member \"" + name + "\" in object " +
|
||||||
|
// "member initialization",
|
||||||
|
// infoerr.ErrorKindError)
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // parse the argument determining the member initialization
|
||||||
|
// // value
|
||||||
|
// err = parser.nextToken()
|
||||||
|
// if err != nil { return }
|
||||||
|
// var value Argument
|
||||||
|
// if parser.token.Is(lexer.TokenKindNewline) {
|
||||||
|
//
|
||||||
|
// // recurse
|
||||||
|
// err = parser.nextToken(lexer.TokenKindIndent)
|
||||||
|
// if err != nil { return }
|
||||||
|
//
|
||||||
|
// value, err = parser.parseDefaultValues(baseIndent)
|
||||||
|
// defaultValues.attributes[name] = value
|
||||||
|
// if err != nil { return }
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
|
//
|
||||||
|
// // parse as normal argument
|
||||||
|
// value, err = parser.parseArgument()
|
||||||
|
// defaultValues.attributes[name] = value
|
||||||
|
// if err != nil { return }
|
||||||
|
//
|
||||||
|
// err = parser.expect(lexer.TokenKindNewline)
|
||||||
|
// if err != nil { return }
|
||||||
|
// err = parser.nextToken()
|
||||||
|
// if err != nil { return }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // parseArrayDefaultValues parses a list of array initialization values until
|
||||||
|
// // the indentation lexel drops.
|
||||||
|
// func (parser *ParsingOperation) parseArrayDefaultValues () (
|
||||||
|
// defaultValues ArrayDefaultValues,
|
||||||
|
// err error,
|
||||||
|
// ) {
|
||||||
|
// baseIndent := 0
|
||||||
|
// begin := true
|
||||||
|
//
|
||||||
|
// for {
|
||||||
|
// // if there is no indent we can just stop parsing
|
||||||
|
// if !parser.token.Is(lexer.TokenKindIndent) { break}
|
||||||
|
// indent := parser.token.Value().(int)
|
||||||
|
//
|
||||||
|
// if begin == true {
|
||||||
|
// defaultValues.location = parser.token.Location()
|
||||||
|
// baseIndent = indent
|
||||||
|
// begin = false
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // do not parse any further if the indent has changed
|
||||||
|
// if indent != baseIndent { break }
|
||||||
|
//
|
||||||
|
// // move on to the beginning of the line, which must contain
|
||||||
|
// // arguments
|
||||||
|
// err = parser.nextToken(validArgumentStartTokens...)
|
||||||
|
// if err != nil { return }
|
||||||
|
//
|
||||||
|
// for {
|
||||||
|
// // stop parsing this line and go on to the next if a
|
||||||
|
// // newline token is encountered
|
||||||
|
// if parser.token.Is(lexer.TokenKindNewline) {
|
||||||
|
// err = parser.nextToken()
|
||||||
|
// if err != nil { return }
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // otherwise, parse the argument
|
||||||
|
// var argument Argument
|
||||||
|
// argument, err = parser.parseArgument()
|
||||||
|
// if err != nil { return }
|
||||||
|
// defaultValues.values = append (
|
||||||
|
// defaultValues.values,
|
||||||
|
// argument)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return
|
||||||
|
// }
|
@ -73,22 +73,13 @@ func (parser *ParsingOperation) parseEnumMembers (
|
|||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
// parse default value
|
// parse default value
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
member.value, err = parser.parseArgument()
|
||||||
err = parser.nextToken()
|
into.members = append(into.members, member)
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
member.value, err = parser.parseDefaultValues(1)
|
err = parser.expect(lexer.TokenKindNewline)
|
||||||
into.members = append(into.members, member)
|
if err != nil { return }
|
||||||
if err != nil { return }
|
err = parser.nextToken()
|
||||||
} else {
|
if err != nil { return }
|
||||||
member.value, err = parser.parseArgument()
|
|
||||||
into.members = append(into.members, member)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
err = parser.expect(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,33 +187,10 @@ func (parser *ParsingOperation) parseFuncArguments (
|
|||||||
output.what, err = parser.parseType()
|
output.what, err = parser.parseType()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
// skip the default value if we are skimming
|
parser.expect(lexer.TokenKindNewline)
|
||||||
if parser.skimming {
|
if err != nil { return }
|
||||||
err = parser.skipIndentLevel(2)
|
err = parser.nextToken()
|
||||||
into.outputs = append(into.outputs, output)
|
if err != nil { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse default value
|
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
output.value, err =
|
|
||||||
parser.parseDefaultValues(1)
|
|
||||||
into.outputs = append(into.outputs, output)
|
|
||||||
if err != nil { return }
|
|
||||||
} else {
|
|
||||||
output.value, err =
|
|
||||||
parser.parseArgument()
|
|
||||||
into.outputs = append(into.outputs, output)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
err = parser.expect(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,179 +0,0 @@
|
|||||||
package parser
|
|
||||||
|
|
||||||
import "git.tebibyte.media/arf/arf/lexer"
|
|
||||||
import "git.tebibyte.media/arf/arf/infoerr"
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// (parser *ParsingOperation) parseDefaultValues
|
|
||||||
|
|
||||||
// (parser *ParsingOperation) parseDefaultMemberValues (return tree of new members and a tree of member values)
|
|
||||||
// (parser *ParsingOperation) parseDefaultArrayValues
|
|
||||||
|
|
||||||
// (parser *ParsingOperation) parseDefaultMemberValue
|
|
||||||
// (parser *ParsingOperation) parseMemberDeclaration
|
|
||||||
|
|
||||||
// parsedefaultValues starts on the line after a data section, or a set
|
|
||||||
// phrase. It checks for an indent greater than the indent of the aforementioned
|
|
||||||
// data section or set phrase (passed through baseIndent), and if there is,
|
|
||||||
// it parses initialization values.
|
|
||||||
func (parser *ParsingOperation) parseDefaultValues (
|
|
||||||
baseIndent int,
|
|
||||||
) (
|
|
||||||
argument Argument,
|
|
||||||
err error,
|
|
||||||
) {
|
|
||||||
// check if line is indented one more than baseIndent
|
|
||||||
if !parser.token.Is(lexer.TokenKindIndent) { return }
|
|
||||||
if parser.token.Value().(int) != baseIndent + 1 { return }
|
|
||||||
|
|
||||||
argument.location = parser.token.Location()
|
|
||||||
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindDot) {
|
|
||||||
|
|
||||||
// object initialization
|
|
||||||
parser.previousToken()
|
|
||||||
var values ObjectDefaultValues
|
|
||||||
values, err = parser.parseObjectdefaultValues()
|
|
||||||
argument.kind = ArgumentKindObjectDefaultValues
|
|
||||||
argument.value = values
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// array initialization
|
|
||||||
parser.previousToken()
|
|
||||||
var values ArrayDefaultValues
|
|
||||||
values, err = parser.parseArrayDefaultValues()
|
|
||||||
argument.kind = ArgumentKindArrayDefaultValues
|
|
||||||
argument.value = values
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseObjectdefaultValues parses a list of object initialization
|
|
||||||
// values until the indentation level drops.
|
|
||||||
func (parser *ParsingOperation) parseObjectdefaultValues () (
|
|
||||||
defaultValues ObjectDefaultValues,
|
|
||||||
err error,
|
|
||||||
) {
|
|
||||||
defaultValues.attributes = make(map[string] Argument)
|
|
||||||
|
|
||||||
baseIndent := 0
|
|
||||||
begin := true
|
|
||||||
|
|
||||||
for {
|
|
||||||
// if there is no indent we can just stop parsing
|
|
||||||
if !parser.token.Is(lexer.TokenKindIndent) { break}
|
|
||||||
indent := parser.token.Value().(int)
|
|
||||||
|
|
||||||
if begin == true {
|
|
||||||
defaultValues.location = parser.token.Location()
|
|
||||||
baseIndent = indent
|
|
||||||
begin = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// do not parse any further if the indent has changed
|
|
||||||
if indent != baseIndent { break }
|
|
||||||
|
|
||||||
// move on to the beginning of the line, which must contain
|
|
||||||
// a member initialization value
|
|
||||||
err = parser.nextToken(lexer.TokenKindDot)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken(lexer.TokenKindName)
|
|
||||||
if err != nil { return }
|
|
||||||
name := parser.token.Value().(string)
|
|
||||||
|
|
||||||
// if the member has already been listed, throw an error
|
|
||||||
_, exists := defaultValues.attributes[name]
|
|
||||||
if exists {
|
|
||||||
err = parser.token.NewError (
|
|
||||||
"duplicate member \"" + name + "\" in object " +
|
|
||||||
"member initialization",
|
|
||||||
infoerr.ErrorKindError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse the argument determining the member initialization
|
|
||||||
// value
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
var value Argument
|
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
|
||||||
|
|
||||||
// recurse
|
|
||||||
err = parser.nextToken(lexer.TokenKindIndent)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
value, err = parser.parseDefaultValues(baseIndent)
|
|
||||||
defaultValues.attributes[name] = value
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// parse as normal argument
|
|
||||||
value, err = parser.parseArgument()
|
|
||||||
defaultValues.attributes[name] = value
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
err = parser.expect(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseArrayDefaultValues parses a list of array initialization values until
|
|
||||||
// the indentation lexel drops.
|
|
||||||
func (parser *ParsingOperation) parseArrayDefaultValues () (
|
|
||||||
defaultValues ArrayDefaultValues,
|
|
||||||
err error,
|
|
||||||
) {
|
|
||||||
baseIndent := 0
|
|
||||||
begin := true
|
|
||||||
|
|
||||||
for {
|
|
||||||
// if there is no indent we can just stop parsing
|
|
||||||
if !parser.token.Is(lexer.TokenKindIndent) { break}
|
|
||||||
indent := parser.token.Value().(int)
|
|
||||||
|
|
||||||
if begin == true {
|
|
||||||
defaultValues.location = parser.token.Location()
|
|
||||||
baseIndent = indent
|
|
||||||
begin = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// do not parse any further if the indent has changed
|
|
||||||
if indent != baseIndent { break }
|
|
||||||
|
|
||||||
// move on to the beginning of the line, which must contain
|
|
||||||
// arguments
|
|
||||||
err = parser.nextToken(validArgumentStartTokens...)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
for {
|
|
||||||
// stop parsing this line and go on to the next if a
|
|
||||||
// newline token is encountered
|
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, parse the argument
|
|
||||||
var argument Argument
|
|
||||||
argument, err = parser.parseArgument()
|
|
||||||
if err != nil { return }
|
|
||||||
defaultValues.values = append (
|
|
||||||
defaultValues.values,
|
|
||||||
argument)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
@ -1,74 +1,6 @@
|
|||||||
package parser
|
package parser
|
||||||
|
|
||||||
import "git.tebibyte.media/arf/arf/lexer"
|
import "git.tebibyte.media/arf/arf/lexer"
|
||||||
import "git.tebibyte.media/arf/arf/infoerr"
|
|
||||||
|
|
||||||
// parseType parses a type notation of the form Name, {Name}, etc.
|
|
||||||
func (parser *ParsingOperation) parseType () (what Type, err error) {
|
|
||||||
err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace)
|
|
||||||
if err != nil { return }
|
|
||||||
what.location = parser.token.Location()
|
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindLBrace) {
|
|
||||||
what.kind = TypeKindPointer
|
|
||||||
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
var points Type
|
|
||||||
points, err = parser.parseType()
|
|
||||||
if err != nil { return }
|
|
||||||
what.points = &points
|
|
||||||
|
|
||||||
err = parser.expect (
|
|
||||||
lexer.TokenKindRBrace,
|
|
||||||
lexer.TokenKindElipsis)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindElipsis) {
|
|
||||||
what.kind = TypeKindVariableArray
|
|
||||||
|
|
||||||
err = parser.nextToken(lexer.TokenKindRBrace)
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
} else {
|
|
||||||
what.name, err = parser.parseIdentifier()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
if !parser.token.Is(lexer.TokenKindColon) { break }
|
|
||||||
|
|
||||||
err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt)
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
if parser.token.Is(lexer.TokenKindName) {
|
|
||||||
// parse type qualifier
|
|
||||||
qualifier := parser.token.Value().(string)
|
|
||||||
switch qualifier {
|
|
||||||
case "mut":
|
|
||||||
what.mutable = true
|
|
||||||
default:
|
|
||||||
err = parser.token.NewError (
|
|
||||||
"unknown type qualifier \"" +
|
|
||||||
qualifier + "\"",
|
|
||||||
infoerr.ErrorKindError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// parse fixed array length
|
|
||||||
what.length = parser.token.Value().(uint64)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseIdentifier parses an identifier made out of dot separated names.
|
// parseIdentifier parses an identifier made out of dot separated names.
|
||||||
func (parser *ParsingOperation) parseIdentifier () (
|
func (parser *ParsingOperation) parseIdentifier () (
|
||||||
|
@ -213,18 +213,6 @@ func (parser *ParsingOperation) parseBlockLevelPhrase (
|
|||||||
err = parser.nextToken()
|
err = parser.nextToken()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
// if this is a set phrase, parse initialization values under it
|
|
||||||
if phrase.kind == PhraseKindAssign {
|
|
||||||
var values Argument
|
|
||||||
values, err = parser.parseDefaultValues(indent)
|
|
||||||
|
|
||||||
if values.kind != ArgumentKindNil {
|
|
||||||
phrase.arguments = append(phrase.arguments, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// if this is a control flow phrase, parse block under it
|
// if this is a control flow phrase, parse block under it
|
||||||
isControlFlow := false
|
isControlFlow := false
|
||||||
for _, kind := range controlFlowKinds {
|
for _, kind := range controlFlowKinds {
|
||||||
|
@ -87,7 +87,8 @@ func (what Type) ToString () (output string) {
|
|||||||
if what.mutable {
|
if what.mutable {
|
||||||
output += ":mut"
|
output += ":mut"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: print out default value
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,29 +261,7 @@ func (section DataSection) ToString (indent int) (output string) {
|
|||||||
"type ",
|
"type ",
|
||||||
section.permission.ToString(), " ",
|
section.permission.ToString(), " ",
|
||||||
section.name, ":",
|
section.name, ":",
|
||||||
section.what.ToString())
|
section.what.ToString(), "\n")
|
||||||
|
|
||||||
isComplexInitialization :=
|
|
||||||
section.value.kind == ArgumentKindObjectDefaultValues ||
|
|
||||||
section.value.kind == ArgumentKindArrayDefaultValues
|
|
||||||
|
|
||||||
if !isComplexInitialization && section.value.value != nil {
|
|
||||||
output += " " + section.value.ToString(0, false)
|
|
||||||
}
|
|
||||||
output += "\n"
|
|
||||||
|
|
||||||
for _, member := range section.what.members {
|
|
||||||
output += member.ToString(indent + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if isComplexInitialization {
|
|
||||||
output += section.value.ToString(indent + 1, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
if section.external {
|
|
||||||
output += "\n"
|
|
||||||
output += doIndent(indent + 1, "external\n")
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,24 +287,7 @@ func (section TypeSection) ToString (indent int) (output string) {
|
|||||||
"type ",
|
"type ",
|
||||||
section.permission.ToString(), " ",
|
section.permission.ToString(), " ",
|
||||||
section.name, ":",
|
section.name, ":",
|
||||||
section.what.ToString())
|
section.what.ToString(), "\n")
|
||||||
|
|
||||||
isComplexInitialization :=
|
|
||||||
section.value.kind == ArgumentKindObjectDefaultValues ||
|
|
||||||
section.value.kind == ArgumentKindArrayDefaultValues
|
|
||||||
|
|
||||||
if !isComplexInitialization && section.value.value != nil {
|
|
||||||
output += " " + section.value.ToString(0, false)
|
|
||||||
}
|
|
||||||
output += "\n"
|
|
||||||
|
|
||||||
for _, member := range section.what.members {
|
|
||||||
output += member.ToString(indent + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if isComplexInitialization {
|
|
||||||
output += section.value.ToString(indent + 1, true)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,24 +405,9 @@ func (block Block) ToString (indent int) (output string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (funcOutput FuncOutput) ToString (indent int) (output string) {
|
func (funcOutput FuncOutput) ToString (indent int) (output string) {
|
||||||
output += doIndent(indent + 1, "< ", funcOutput.Declaration.ToString())
|
output += doIndent (
|
||||||
|
indent + 1,
|
||||||
isComplexInitialization :=
|
"< ", funcOutput.Declaration.ToString(), "\n")
|
||||||
funcOutput.value.kind == ArgumentKindObjectDefaultValues ||
|
|
||||||
funcOutput.value.kind == ArgumentKindArrayDefaultValues
|
|
||||||
|
|
||||||
if !isComplexInitialization && funcOutput.value.value != nil {
|
|
||||||
output += " " + funcOutput.value.ToString(0, false)
|
|
||||||
}
|
|
||||||
output += "\n"
|
|
||||||
|
|
||||||
for _, member := range funcOutput.what.members {
|
|
||||||
output += member.ToString(indent + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if isComplexInitialization {
|
|
||||||
output += funcOutput.value.ToString(indent + 1, true)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,6 @@ type TypeMember struct {
|
|||||||
nameable
|
nameable
|
||||||
typeable
|
typeable
|
||||||
permissionable
|
permissionable
|
||||||
valuable
|
|
||||||
|
|
||||||
bitWidth uint64
|
bitWidth uint64
|
||||||
}
|
}
|
||||||
@ -84,7 +83,10 @@ type Type struct {
|
|||||||
points *Type
|
points *Type
|
||||||
|
|
||||||
// if non-nil, this type defines new members.
|
// if non-nil, this type defines new members.
|
||||||
members []TypeMember
|
members []TypeMember
|
||||||
|
|
||||||
|
// the default value of the type.
|
||||||
|
defaultValue Argument
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declaration represents a variable declaration.
|
// Declaration represents a variable declaration.
|
||||||
@ -180,7 +182,6 @@ type DataSection struct {
|
|||||||
nameable
|
nameable
|
||||||
typeable
|
typeable
|
||||||
permissionable
|
permissionable
|
||||||
valuable
|
|
||||||
|
|
||||||
external bool
|
external bool
|
||||||
}
|
}
|
||||||
@ -191,7 +192,6 @@ type TypeSection struct {
|
|||||||
nameable
|
nameable
|
||||||
typeable
|
typeable
|
||||||
permissionable
|
permissionable
|
||||||
valuable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EnumMember represents a member of an enum section.
|
// EnumMember represents a member of an enum section.
|
||||||
@ -270,7 +270,6 @@ type Block []Phrase
|
|||||||
// that it can have a default value.
|
// that it can have a default value.
|
||||||
type FuncOutput struct {
|
type FuncOutput struct {
|
||||||
Declaration
|
Declaration
|
||||||
valuable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FuncSection represents a function section.
|
// FuncSection represents a function section.
|
||||||
|
72
parser/type-notation.go
Normal file
72
parser/type-notation.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package parser
|
||||||
|
|
||||||
|
import "git.tebibyte.media/arf/arf/lexer"
|
||||||
|
import "git.tebibyte.media/arf/arf/infoerr"
|
||||||
|
|
||||||
|
// parseType parses a type notation of the form Name, {Name}, etc.
|
||||||
|
func (parser *ParsingOperation) parseType () (what Type, err error) {
|
||||||
|
err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace)
|
||||||
|
if err != nil { return }
|
||||||
|
what.location = parser.token.Location()
|
||||||
|
|
||||||
|
if parser.token.Is(lexer.TokenKindLBrace) {
|
||||||
|
what.kind = TypeKindPointer
|
||||||
|
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
|
||||||
|
var points Type
|
||||||
|
points, err = parser.parseType()
|
||||||
|
if err != nil { return }
|
||||||
|
what.points = &points
|
||||||
|
|
||||||
|
err = parser.expect (
|
||||||
|
lexer.TokenKindRBrace,
|
||||||
|
lexer.TokenKindElipsis)
|
||||||
|
if err != nil { return }
|
||||||
|
|
||||||
|
if parser.token.Is(lexer.TokenKindElipsis) {
|
||||||
|
what.kind = TypeKindVariableArray
|
||||||
|
|
||||||
|
err = parser.nextToken(lexer.TokenKindRBrace)
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
} else {
|
||||||
|
what.name, err = parser.parseIdentifier()
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
if !parser.token.Is(lexer.TokenKindColon) { break }
|
||||||
|
|
||||||
|
err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt)
|
||||||
|
if err != nil { return }
|
||||||
|
|
||||||
|
if parser.token.Is(lexer.TokenKindName) {
|
||||||
|
// parse type qualifier
|
||||||
|
qualifier := parser.token.Value().(string)
|
||||||
|
switch qualifier {
|
||||||
|
case "mut":
|
||||||
|
what.mutable = true
|
||||||
|
default:
|
||||||
|
err = parser.token.NewError (
|
||||||
|
"unknown type qualifier \"" +
|
||||||
|
qualifier + "\"",
|
||||||
|
infoerr.ErrorKindError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// parse fixed array length
|
||||||
|
what.length = parser.token.Value().(uint64)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
@ -32,21 +32,10 @@ func (parser *ParsingOperation) parseTypeSection () (
|
|||||||
section.what, err = parser.parseType()
|
section.what, err = parser.parseType()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
// parse default values
|
parser.expect(lexer.TokenKindNewline)
|
||||||
if parser.token.Is(lexer.TokenKindNewline) {
|
if err != nil { return }
|
||||||
err = parser.nextToken()
|
err = parser.nextToken()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
|
|
||||||
section.value, err = parser.parseDefaultValues(0)
|
|
||||||
if err != nil { return }
|
|
||||||
} else {
|
|
||||||
section.value, err = parser.parseArgument()
|
|
||||||
if err != nil { return }
|
|
||||||
|
|
||||||
err = parser.expect(lexer.TokenKindNewline)
|
|
||||||
if err != nil { return }
|
|
||||||
err = parser.nextToken()
|
|
||||||
if err != nil { return }
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user