implement-modules #43
@ -10,7 +10,7 @@
|
|||||||
| | +Star =LiteralArray
|
| | +Star =LiteralArray
|
||||||
| | +Dot =LiteralStruct
|
| | +Dot =LiteralStruct
|
||||||
|
|
|
|
||||||
| +LBracket | +Ident =Call *
|
| +LBracket | +Ident =Call
|
||||||
| | | 'break' =Break
|
| | | 'break' =Break
|
||||||
| | | 'return' =Return
|
| | | 'return' =Return
|
||||||
| |
|
| |
|
||||||
|
@ -108,7 +108,7 @@ func (this *Parser) parseExpressionRootLBracketIdent (pos errors.Position) (enti
|
|||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
case "break", "return": return this.parseReturnOrBreakCore(pos)
|
case "break", "return": return this.parseReturnOrBreakCore(pos)
|
||||||
default: // TODO return this.parseCallCore(pos)
|
default: return this.parseCallCore(pos)
|
||||||
}
|
}
|
||||||
panic(this.bug())
|
panic(this.bug())
|
||||||
}
|
}
|
||||||
@ -119,17 +119,17 @@ func (this *Parser) parseReturnOrBreakCore (pos errors.Position) (entity.Express
|
|||||||
name := this.value()
|
name := this.value()
|
||||||
|
|
||||||
err = this.expectNextDesc (
|
err = this.expectNextDesc (
|
||||||
"Expression or Call end",
|
"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
|
||||||
if this.token.Is(startTokensExpression...) {
|
if this.token.Is(startTokensExpression...) {
|
||||||
// startTokensExpression...: return/break expression
|
// startTokensExpression...: value expression
|
||||||
value, err = this.parseExpression()
|
value, err = this.parseExpression()
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
}
|
}
|
||||||
|
|
||||||
err = this.expectDesc("Call end", lexer.RBracket)
|
err = this.expectDesc("end of " + name, lexer.RBracket)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
pos = pos.Union(this.pos())
|
pos = pos.Union(this.pos())
|
||||||
this.next()
|
this.next()
|
||||||
@ -149,6 +149,32 @@ func (this *Parser) parseReturnOrBreakCore (pos errors.Position) (entity.Express
|
|||||||
panic(this.bug())
|
panic(this.bug())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *Parser) parseCallCore (pos errors.Position) (*entity.Call, error) {
|
||||||
|
err := this.expect(lexer.Ident)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
call := &entity.Call {
|
||||||
|
Position: pos,
|
||||||
|
Name: this.value(),
|
||||||
|
}
|
||||||
|
this.next()
|
||||||
|
|
||||||
|
for {
|
||||||
|
err = this.expectDesc (
|
||||||
|
"Expression or Call end",
|
||||||
|
appendCopy(startTokensExpression, lexer.RBracket)...)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
if this.token.Is(lexer.RBracket) { break }
|
||||||
|
|
||||||
|
argument, err := this.parseExpression()
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
call.Arguments = append(call.Arguments, argument)
|
||||||
|
}
|
||||||
|
call.Position = call.Position.Union(this.pos())
|
||||||
|
this.next()
|
||||||
|
|
||||||
|
return call, nil
|
||||||
|
}
|
||||||
|
|
||||||
var valuesOperator = []string {
|
var valuesOperator = []string {
|
||||||
"++", "+", "--", "-", "*", "/", "%", "!!", "||", "&&", "^^",
|
"++", "+", "--", "-", "*", "/", "%", "!!", "||", "&&", "^^",
|
||||||
"!", "|", "&", "^", "<<", ">>", "<", ">", "<=", ">=", "=",
|
"!", "|", "&", "^", "<<", ">>", "<", ">", "<=", ">=", "=",
|
||||||
|
Loading…
Reference in New Issue
Block a user