Parse dereferences and subscripts
This commit is contained in:
parent
7697bab51a
commit
c347add41c
@ -22,8 +22,8 @@ import "git.tebibyte.media/sashakoshka/fspl/entity"
|
|||||||
// | | | 'break' =Break
|
// | | | 'break' =Break
|
||||||
// | | | 'return' =Return
|
// | | | 'return' =Return
|
||||||
// | |
|
// | |
|
||||||
// | | +Dot +Expression =Dereference *
|
// | | +Dot +Expression =Dereference
|
||||||
// | | | +Expression =Subscript *
|
// | | | +Expression =Subscript
|
||||||
// | | +Symbol X
|
// | | +Symbol X
|
||||||
// | | '\' =Slice *
|
// | | '\' =Slice *
|
||||||
// | | '#' =Length *
|
// | | '#' =Length *
|
||||||
@ -134,7 +134,7 @@ func (this *Parser) parseExpressionRootLBracket () (entity.Expression, error) {
|
|||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
switch this.kind() {
|
switch this.kind() {
|
||||||
case lexer.Ident: return this.parseExpressionRootLBracketIdent(pos)
|
case lexer.Ident: return this.parseExpressionRootLBracketIdent(pos)
|
||||||
case lexer.Dot: // TODO return this.parseExpressionRootLBracketDot(pos)
|
case lexer.Dot: return this.parseDereferenceOrSubscriptCore(pos)
|
||||||
case lexer.Symbol: return this.parseExpressionRootLBracketSymbol(pos)
|
case lexer.Symbol: return this.parseExpressionRootLBracketSymbol(pos)
|
||||||
}
|
}
|
||||||
panic(this.bug())
|
panic(this.bug())
|
||||||
@ -158,7 +158,7 @@ func (this *Parser) parseReturnOrBreakCore (pos errors.Position) (entity.Express
|
|||||||
name := this.value()
|
name := this.value()
|
||||||
|
|
||||||
err = this.expectNextDesc (
|
err = this.expectNextDesc (
|
||||||
"Expression or end of " + name,
|
"expression or end of " + name,
|
||||||
appendCopy(startTokensExpression, lexer.RBracket)...)
|
appendCopy(startTokensExpression, lexer.RBracket)...)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
var value entity.Expression
|
var value entity.Expression
|
||||||
@ -188,6 +188,47 @@ func (this *Parser) parseReturnOrBreakCore (pos errors.Position) (entity.Express
|
|||||||
panic(this.bug())
|
panic(this.bug())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *Parser) parseDereferenceOrSubscriptCore (pos errors.Position) (entity.Expression, error) {
|
||||||
|
err := this.expect(lexer.Dot)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
|
this.next()
|
||||||
|
argument, err := this.parseExpression()
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
|
err = this.expectDesc (
|
||||||
|
"element offset expression or end of dereference",
|
||||||
|
appendCopy(startTokensExpression, lexer.RBracket)...)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
|
if this.token.Is(lexer.RBracket) {
|
||||||
|
// RBracket: dereference
|
||||||
|
pos = pos.Union(this.pos())
|
||||||
|
this.next()
|
||||||
|
|
||||||
|
return &entity.Dereference {
|
||||||
|
Position: pos,
|
||||||
|
Pointer: argument,
|
||||||
|
}, nil
|
||||||
|
} else {
|
||||||
|
// startTokensExpression...: subscript
|
||||||
|
offset, err := this.parseExpression()
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
|
err = this.expect(lexer.RBracket)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
pos = pos.Union(this.pos())
|
||||||
|
this.next()
|
||||||
|
|
||||||
|
return &entity.Subscript {
|
||||||
|
Position: pos,
|
||||||
|
Slice: argument,
|
||||||
|
Offset: offset,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func (this *Parser) parseCallCore (pos errors.Position) (*entity.Call, error) {
|
func (this *Parser) parseCallCore (pos errors.Position) (*entity.Call, error) {
|
||||||
err := this.expect(lexer.Ident)
|
err := this.expect(lexer.Ident)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
|
Loading…
Reference in New Issue
Block a user