|
@@ -244,7 +244,7 @@ func (parser *Parser) ParseArgument() *Ast {
|
|
|
parser.LogDebug("ParseArgument: %s\n", parser.current.String())
|
|
|
|
|
|
switch {
|
|
|
- case parser.NextIsName(): return parser.ParseName()
|
|
|
+ case parser.NextIsName(): return parser.ParseField()
|
|
|
case parser.NextIsBlock(): return parser.ParseBlock()
|
|
|
case parser.NextIsSubstitution(): return parser.ParseSubstitution()
|
|
|
case parser.NextIsLiteral(): return parser.ParseLiteral()
|
|
@@ -393,6 +393,27 @@ func (parser *Parser) ParseOrigin() *Ast {
|
|
|
return target
|
|
|
}
|
|
|
|
|
|
+func (parser *Parser) ParseSelector() *Ast {
|
|
|
+ parser.LogDebug("ParseSelector %s\n", parser.current.String())
|
|
|
+ selector := parser.Require(TokenKindSelector)
|
|
|
+ parameter := parser.ParseArgument()
|
|
|
+ ast := NewAstWithToken(AstKindSelector, selector)
|
|
|
+ ast.AppendChild(parameter)
|
|
|
+ return ast
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (parser *Parser) ParseField() *Ast {
|
|
|
+
|
|
|
+ name := parser.ParseName()
|
|
|
+ if parser.NextIsSelector() {
|
|
|
+ selector := parser.ParseSelector()
|
|
|
+
|
|
|
+ selector.children = append([]*Ast{name}, selector.children...)
|
|
|
+ }
|
|
|
+
|
|
|
+ return name
|
|
|
+}
|
|
|
|
|
|
func (parser *Parser) ParseSet() *Ast {
|
|
|
parser.LogDebug("ParseSet: %s\n", parser.current.String())
|
|
@@ -417,9 +438,10 @@ func (parser *Parser) ParseGet() *Ast {
|
|
|
func (parser *Parser) ParseCommand() *Ast {
|
|
|
parser.LogDebug("ParseCommand: %s\n", parser.current.String())
|
|
|
|
|
|
- word := parser.Require(TokenKindWord, TokenKindType)
|
|
|
+ field := parser.ParseField()
|
|
|
arguments := parser.ParseArguments()
|
|
|
- command := NewAstWithToken(AstKindCommand, word)
|
|
|
+
|
|
|
+ command := NewAstWithToken(AstKindCommand, field.Token())
|
|
|
command.AppendChild(arguments)
|
|
|
return command
|
|
|
}
|
|
@@ -519,7 +541,11 @@ func (parser Parser) NextIsName() bool {
|
|
|
}
|
|
|
|
|
|
func (parser Parser) NextIsOperator() bool {
|
|
|
- return parser.NextIs(TokenKindOperator, TokenKindRedirect, TokenKindMethod)
|
|
|
+ return parser.NextIs(TokenKindOperator)
|
|
|
+}
|
|
|
+
|
|
|
+func (parser Parser) NextIsSelector() bool {
|
|
|
+ return parser.NextIs(TokenKindSelector)
|
|
|
}
|
|
|
|
|
|
func (parser Parser) NextIsArgument() bool {
|
|
@@ -569,15 +595,7 @@ func (parser *Parser) newMethodChain(oper Token, expr1, expr2 *Ast) *Ast {
|
|
|
}
|
|
|
|
|
|
func (parser *Parser) newChain(oper Token, expr1, expr2 *Ast) * Ast {
|
|
|
- var astkind AstKind = AstKindParenthesis
|
|
|
-
|
|
|
- if oper.TokenKind == TokenKindRedirect {
|
|
|
- parser.LogDebug("New redirect chain.")
|
|
|
- astkind = AstKindStatements
|
|
|
- } else if oper.TokenKind == TokenKindMethod {
|
|
|
- return parser.newMethodChain(oper, expr1, expr2)
|
|
|
- }
|
|
|
-
|
|
|
+ var astkind AstKind = AstKindParenthesis
|
|
|
subst1 := NewAstWithToken(astkind, oper)
|
|
|
subst1.AppendChildren(expr1)
|
|
|
subst2 := NewAstWithToken(astkind, oper)
|
|
@@ -588,20 +606,8 @@ func (parser *Parser) newChain(oper Token, expr1, expr2 *Ast) * Ast {
|
|
|
}
|
|
|
|
|
|
func (parser *Parser) composeChain(oper Token, chain, nextExpr *Ast) * Ast {
|
|
|
- var astkind AstKind = AstKindParenthesis
|
|
|
-
|
|
|
- if oper.TokenKind == TokenKindRedirect {
|
|
|
- parser.LogDebug("Composed redirect chain: %v", chain)
|
|
|
- astkind = AstKindStatements
|
|
|
- } else if oper.TokenKind == TokenKindMethod {
|
|
|
- chain.AppendChild(NewAstWithToken(AstKindForToken(nextExpr.Token()), nextExpr.Token()))
|
|
|
- chain.AppendChildren(nextExpr.Children()...)
|
|
|
- parser.LogDebug("Composed method chain: %v", chain)
|
|
|
- return chain
|
|
|
- } else {
|
|
|
- parser.LogDebug("Composed normal chain: %v", chain)
|
|
|
- }
|
|
|
-
|
|
|
+ var astkind AstKind = AstKindParenthesis
|
|
|
+ parser.LogDebug("Composed chain: %v", chain)
|
|
|
subst := NewAstWithToken(astkind, oper)
|
|
|
subst.AppendChildren(nextExpr)
|
|
|
newChain := NewAstWithToken(AstKindOperation, oper)
|
|
@@ -618,7 +624,7 @@ func (parser *Parser) ParseChain() *Ast {
|
|
|
var expressions = []*Ast{ expression }
|
|
|
var operators = []Token {}
|
|
|
for parser.NextIsOperator() {
|
|
|
- oper := parser.Require(TokenKindOperator, TokenKindRedirect, TokenKindMethod)
|
|
|
+ oper := parser.Require(TokenKindOperator)
|
|
|
expression := parser.ParseExpression()
|
|
|
if expression == nil {
|
|
|
parser.Panicf("Expected expression after operator.")
|