diff --git a/node/expr/variable.go b/node/expr/variable.go index 7486246..94fafef 100644 --- a/node/expr/variable.go +++ b/node/expr/variable.go @@ -5,21 +5,25 @@ import ( "io" "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/token" ) type Variable struct { node.SimpleNode - token token.Token + name node.Node } -func NewVariable(token token.Token) node.Node { +func NewVariable(name node.Node) node.Node { return Variable{ node.SimpleNode{Name: "Variable", Attributes: make(map[string]string)}, - token, + name, } } func (n Variable) Print(out io.Writer, indent string) { - fmt.Fprintf(out, "\n%v%v [%d %d] %q", indent, n.Name, n.token.StartLine, n.token.EndLine, n.token.Value) + fmt.Fprintf(out, "\n%v%v [- -]", indent, n.Name) + + if n.name != nil { + fmt.Fprintf(out, "\n%vname:", indent+" ") + n.name.Print(out, indent+" ") + } } diff --git a/parser/parser.go b/parser/parser.go index af2a052..abd2715 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -2958,7 +2958,7 @@ yydefault: yyDollar = yyS[yypt-9 : yypt+1] //line parser/parser.y:415 { - yyVAL.list = append(yyDollar[1].list, stmt.NewCatch(yyDollar[2].token, yyDollar[4].list, expr.NewVariable(yyDollar[5].token), yyDollar[8].node.(node.SimpleNode).Children)) + yyVAL.list = append(yyDollar[1].list, stmt.NewCatch(yyDollar[2].token, yyDollar[4].list, expr.NewVariable(node.NewIdentifier(yyDollar[5].token)), yyDollar[8].node.(node.SimpleNode).Children)) } case 155: yyDollar = yyS[yypt-1 : yypt+1] @@ -4293,13 +4293,13 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line parser/parser.y:924 { - yyVAL.node = expr.NewClusureUse(expr.NewVariable(yyDollar[1].token), false) + yyVAL.node = expr.NewClusureUse(expr.NewVariable(node.NewIdentifier(yyDollar[1].token)), false) } case 376: yyDollar = yyS[yypt-2 : yypt+1] //line parser/parser.y:925 { - yyVAL.node = expr.NewClusureUse(expr.NewVariable(yyDollar[2].token), true) + yyVAL.node = expr.NewClusureUse(expr.NewVariable(node.NewIdentifier(yyDollar[2].token)), true) } case 377: yyDollar = yyS[yypt-2 : yypt+1] @@ -4647,19 +4647,19 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line parser/parser.y:1040 { - yyVAL.node = node.NewSimpleNode("Variable").Attribute("name", yyDollar[1].token.String()) + yyVAL.node = expr.NewVariable(node.NewIdentifier(yyDollar[1].token)) } case 435: yyDollar = yyS[yypt-4 : yypt+1] //line parser/parser.y:1041 { - yyVAL.node = node.NewSimpleNode("Variable").Append(yyDollar[3].node) + yyVAL.node = expr.NewVariable(yyDollar[3].node) } case 436: yyDollar = yyS[yypt-2 : yypt+1] //line parser/parser.y:1042 { - yyVAL.node = node.NewSimpleNode("Variable").Append(yyDollar[2].node) + yyVAL.node = expr.NewVariable(yyDollar[2].node) } case 437: yyDollar = yyS[yypt-3 : yypt+1] @@ -4847,37 +4847,37 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line parser/parser.y:1124 { - yyVAL.node = node.NewSimpleNode("Variable").Attribute("value", yyDollar[1].token.String()) + yyVAL.node = expr.NewVariable(node.NewIdentifier(yyDollar[1].token)) } case 467: yyDollar = yyS[yypt-4 : yypt+1] //line parser/parser.y:1125 { - yyVAL.node = expr.NewArrayDimFetch(expr.NewVariable(yyDollar[1].token), yyDollar[3].node) + yyVAL.node = expr.NewArrayDimFetch(expr.NewVariable(node.NewIdentifier(yyDollar[1].token)), yyDollar[3].node) } case 468: yyDollar = yyS[yypt-3 : yypt+1] //line parser/parser.y:1126 { - yyVAL.node = expr.NewPropertyFetch(expr.NewVariable(yyDollar[1].token), node.NewIdentifier(yyDollar[3].token)) + yyVAL.node = expr.NewPropertyFetch(expr.NewVariable(node.NewIdentifier(yyDollar[1].token)), node.NewIdentifier(yyDollar[3].token)) } case 469: yyDollar = yyS[yypt-3 : yypt+1] //line parser/parser.y:1127 { - yyVAL.node = node.NewSimpleNode("Variable").Append(node.NewSimpleNode("expr").Append(yyDollar[2].node)) + yyVAL.node = expr.NewVariable(yyDollar[2].node) } case 470: yyDollar = yyS[yypt-3 : yypt+1] //line parser/parser.y:1128 { - yyVAL.node = node.NewSimpleNode("Variable").Attribute("value", yyDollar[2].token.String()) + yyVAL.node = expr.NewVariable(node.NewIdentifier(yyDollar[2].token)) } case 471: yyDollar = yyS[yypt-6 : yypt+1] //line parser/parser.y:1130 { - yyVAL.node = expr.NewArrayDimFetch(expr.NewVariable(yyDollar[2].token), yyDollar[4].node) + yyVAL.node = expr.NewArrayDimFetch(expr.NewVariable(node.NewIdentifier(yyDollar[2].token)), yyDollar[4].node) } case 472: yyDollar = yyS[yypt-3 : yypt+1] diff --git a/parser/parser.y b/parser/parser.y index bd21524..b43a4fb 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -412,7 +412,7 @@ statement: catch_list: /* empty */ { $$ = []node.Node{} } | catch_list T_CATCH '(' catch_name_list T_VARIABLE ')' '{' inner_statement_list '}' - { $$ = append($1, stmt.NewCatch($2, $4, expr.NewVariable($5), $8.(node.SimpleNode).Children)) } + { $$ = append($1, stmt.NewCatch($2, $4, expr.NewVariable(node.NewIdentifier($5)), $8.(node.SimpleNode).Children)) } ; catch_name_list: name { $$ = []node.Node{$1} } @@ -921,8 +921,8 @@ lexical_var_list: ; lexical_var: - T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable($1), false) } - | '&' T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable($2), true) } + T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable(node.NewIdentifier($1)), false) } + | '&' T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable(node.NewIdentifier($2)), true) } ; function_call: @@ -1037,9 +1037,9 @@ variable: ; simple_variable: - T_VARIABLE { $$ = node.NewSimpleNode("Variable").Attribute("name", $1.String()); } - | '$' '{' expr '}' { $$ = node.NewSimpleNode("Variable").Append($3); } - | '$' simple_variable { $$ = node.NewSimpleNode("Variable").Append($2); } + T_VARIABLE { $$ = expr.NewVariable(node.NewIdentifier($1)) } + | '$' '{' expr '}' { $$ = expr.NewVariable($3) } + | '$' simple_variable { $$ = expr.NewVariable($2) } ; static_member: @@ -1121,13 +1121,13 @@ encaps_list: ; encaps_var: - T_VARIABLE { $$ = node.NewSimpleNode("Variable").Attribute("value", $1.String()) } - | T_VARIABLE '[' encaps_var_offset ']' { $$ = expr.NewArrayDimFetch(expr.NewVariable($1), $3) } - | T_VARIABLE T_OBJECT_OPERATOR T_STRING { $$ = expr.NewPropertyFetch(expr.NewVariable($1), node.NewIdentifier($3)) } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = node.NewSimpleNode("Variable").Append(node.NewSimpleNode("expr").Append($2)) } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = node.NewSimpleNode("Variable").Attribute("value", $2.String()) } + T_VARIABLE { $$ = expr.NewVariable(node.NewIdentifier($1)) } + | T_VARIABLE '[' encaps_var_offset ']' { $$ = expr.NewArrayDimFetch(expr.NewVariable(node.NewIdentifier($1)), $3) } + | T_VARIABLE T_OBJECT_OPERATOR T_STRING { $$ = expr.NewPropertyFetch(expr.NewVariable(node.NewIdentifier($1)), node.NewIdentifier($3)) } + | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = expr.NewVariable($2) } + | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = expr.NewVariable(node.NewIdentifier($2)) } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - { $$ = expr.NewArrayDimFetch(expr.NewVariable($2), $4) } + { $$ = expr.NewArrayDimFetch(expr.NewVariable(node.NewIdentifier($2)), $4) } | T_CURLY_OPEN variable '}' { $$ = $2; } ; encaps_var_offset: