Merge pull request 'Add dereference parsing' (#17) from parse-dereferences into main
Reviewed-on: arf/arf#17
This commit is contained in:
commit
942a52f7c6
@ -3,8 +3,6 @@ package parser
|
|||||||
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"
|
||||||
|
|
||||||
// TODO: add support for dereferences and subscripts
|
|
||||||
|
|
||||||
var validArgumentStartTokens = []lexer.TokenKind {
|
var validArgumentStartTokens = []lexer.TokenKind {
|
||||||
lexer.TokenKindName,
|
lexer.TokenKindName,
|
||||||
|
|
||||||
@ -14,6 +12,7 @@ var validArgumentStartTokens = []lexer.TokenKind {
|
|||||||
lexer.TokenKindString,
|
lexer.TokenKindString,
|
||||||
|
|
||||||
lexer.TokenKindLBracket,
|
lexer.TokenKindLBracket,
|
||||||
|
lexer.TokenKindLBrace,
|
||||||
lexer.TokenKindLParen,
|
lexer.TokenKindLParen,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,6 +80,10 @@ func (parser *ParsingOperation) parseArgument () (argument Argument, err error)
|
|||||||
argument.kind = ArgumentKindPhrase
|
argument.kind = ArgumentKindPhrase
|
||||||
argument.value, err = parser.parseArgumentLevelPhrase()
|
argument.value, err = parser.parseArgumentLevelPhrase()
|
||||||
|
|
||||||
|
case lexer.TokenKindLBrace:
|
||||||
|
argument.kind = ArgumentKindDereference
|
||||||
|
argument.value, err = parser.parseDereference()
|
||||||
|
|
||||||
case lexer.TokenKindLParen:
|
case lexer.TokenKindLParen:
|
||||||
argument.kind = ArgumentKindList
|
argument.kind = ArgumentKindList
|
||||||
argument.value, err = parser.parseList()
|
argument.value, err = parser.parseList()
|
||||||
|
31
parser/dereference.go
Normal file
31
parser/dereference.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package parser
|
||||||
|
|
||||||
|
import "git.tebibyte.media/arf/arf/lexer"
|
||||||
|
|
||||||
|
func (parser *ParsingOperation) parseDereference () (
|
||||||
|
dereference Dereference,
|
||||||
|
err error,
|
||||||
|
) {
|
||||||
|
err = parser.expect(lexer.TokenKindLBrace)
|
||||||
|
if err != nil { return }
|
||||||
|
dereference.location = parser.token.Location()
|
||||||
|
|
||||||
|
// parse the value we are dereferencing
|
||||||
|
err = parser.nextToken(validArgumentStartTokens...)
|
||||||
|
if err != nil { return }
|
||||||
|
dereference.argument, err = parser.parseArgument()
|
||||||
|
if err != nil { return }
|
||||||
|
|
||||||
|
// if there is an offset, parse it
|
||||||
|
err = parser.expect(lexer.TokenKindUInt, lexer.TokenKindRBrace)
|
||||||
|
if err != nil { return }
|
||||||
|
if parser.token.Is(lexer.TokenKindUInt) {
|
||||||
|
dereference.offset = parser.token.Value().(uint64)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = parser.nextToken(lexer.TokenKindRBrace)
|
||||||
|
if err != nil { return }
|
||||||
|
err = parser.nextToken()
|
||||||
|
if err != nil { return }
|
||||||
|
return
|
||||||
|
}
|
@ -105,5 +105,13 @@ func ro hDataInit
|
|||||||
[= y:{Int} [loc x]]
|
[= y:{Int} [loc x]]
|
||||||
[= z:Int:8 (398 9 2309 983 -2387 478 555 123)]
|
[= z:Int:8 (398 9 2309 983 -2387 478 555 123)]
|
||||||
[= bird:Bird ((99999) 324)]
|
[= bird:Bird ((99999) 324)]
|
||||||
|
func ro iDereference
|
||||||
|
> x:{Int}
|
||||||
|
> y:{Int ..}
|
||||||
|
> z:Int:4
|
||||||
|
---
|
||||||
|
[= b:Int {x}]
|
||||||
|
[= c:Int {y 4}]
|
||||||
|
[= d:Int {z 3}]
|
||||||
`, test)
|
`, test)
|
||||||
}
|
}
|
||||||
|
@ -134,6 +134,9 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) {
|
|||||||
case ArgumentKindList:
|
case ArgumentKindList:
|
||||||
output += argument.value.(List).ToString(indent, breakLine)
|
output += argument.value.(List).ToString(indent, breakLine)
|
||||||
|
|
||||||
|
case ArgumentKindDereference:
|
||||||
|
output += argument.value.(Dereference).ToString(indent)
|
||||||
|
|
||||||
case ArgumentKindIdentifier:
|
case ArgumentKindIdentifier:
|
||||||
output += doIndent (
|
output += doIndent (
|
||||||
indent,
|
indent,
|
||||||
@ -276,6 +279,16 @@ func (behavior FaceBehavior) ToString (indent int) (output string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dereference Dereference) ToString (indent int) (output string) {
|
||||||
|
output += "{"
|
||||||
|
output += dereference.argument.ToString(indent, false)
|
||||||
|
if dereference.offset != 0 {
|
||||||
|
output += fmt.Sprint(" ", dereference.offset)
|
||||||
|
}
|
||||||
|
output += "}"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
|
func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
|
||||||
if ownLine {
|
if ownLine {
|
||||||
output += doIndent(indent)
|
output += doIndent(indent)
|
||||||
|
@ -97,10 +97,8 @@ const (
|
|||||||
ArgumentKindList
|
ArgumentKindList
|
||||||
|
|
||||||
// {name}
|
// {name}
|
||||||
ArgumentKindDereference
|
|
||||||
|
|
||||||
// {name 23}
|
// {name 23}
|
||||||
ArgumentKindSubscript
|
ArgumentKindDereference
|
||||||
|
|
||||||
// name.name
|
// name.name
|
||||||
// name.name.name
|
// name.name.name
|
||||||
@ -220,6 +218,15 @@ type FaceSection struct {
|
|||||||
FaceBehavior
|
FaceBehavior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dereference represents a pointer dereference or array subscript.
|
||||||
|
type Dereference struct {
|
||||||
|
locatable
|
||||||
|
valuable
|
||||||
|
|
||||||
|
// if a simple dereference was parsed, this should just be zero.
|
||||||
|
offset uint64
|
||||||
|
}
|
||||||
|
|
||||||
// PhraseKind determines what semantic role a phrase plays.
|
// PhraseKind determines what semantic role a phrase plays.
|
||||||
type PhraseKind int
|
type PhraseKind int
|
||||||
|
|
||||||
|
@ -132,3 +132,12 @@ func ro hDataInit
|
|||||||
= bird:Bird (
|
= bird:Bird (
|
||||||
(99999)
|
(99999)
|
||||||
324)
|
324)
|
||||||
|
|
||||||
|
func ro iDereference
|
||||||
|
> x:{Int}
|
||||||
|
> y:{Int ..}
|
||||||
|
> z:Int:4
|
||||||
|
---
|
||||||
|
= b:Int {x}
|
||||||
|
= c:Int {y 4}
|
||||||
|
= d:Int {z 3}
|
||||||
|
Reference in New Issue
Block a user