class node
This commit is contained in:
parent
2d168cd2e2
commit
60d8874a6f
61
node/stmt/class.go
Normal file
61
node/stmt/class.go
Normal file
@ -0,0 +1,61 @@
|
||||
package stmt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/z7zmey/php-parser/node"
|
||||
"github.com/z7zmey/php-parser/token"
|
||||
)
|
||||
|
||||
type Class struct {
|
||||
node.SimpleNode
|
||||
token token.Token
|
||||
modifiers []string
|
||||
args node.Node
|
||||
extends node.Node
|
||||
implements node.Node
|
||||
stmts node.Node
|
||||
}
|
||||
|
||||
//TODO: stmts myst be []node.Node
|
||||
func NewClass(token token.Token, modifiers []string, args node.Node, extends node.Node, implements node.Node, stmts node.Node) node.Node {
|
||||
return Class{
|
||||
node.SimpleNode{Name: "Class", Attributes: make(map[string]string)},
|
||||
token,
|
||||
modifiers,
|
||||
args,
|
||||
extends,
|
||||
implements,
|
||||
stmts,
|
||||
}
|
||||
}
|
||||
|
||||
func (n Class) 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)
|
||||
|
||||
if n.modifiers != nil {
|
||||
fmt.Fprintf(out, "\n%vmotifiers:", indent+" ")
|
||||
for _, nn := range n.modifiers {
|
||||
fmt.Fprintf(out, "\n%v%q", indent+" ", nn)
|
||||
}
|
||||
}
|
||||
|
||||
if n.args != nil {
|
||||
fmt.Fprintf(out, "\n%vargs:", indent+" ")
|
||||
n.args.Print(out, indent+" ")
|
||||
}
|
||||
|
||||
if n.extends != nil {
|
||||
fmt.Fprintf(out, "\n%vextends:", indent+" ")
|
||||
n.extends.Print(out, indent+" ")
|
||||
}
|
||||
|
||||
if n.implements != nil {
|
||||
fmt.Fprintf(out, "\n%vimplements:", indent+" ")
|
||||
n.implements.Print(out, indent+" ")
|
||||
}
|
||||
|
||||
fmt.Fprintf(out, "\n%vstmts:", indent+" ")
|
||||
n.stmts.Print(out, indent+" ")
|
||||
}
|
1011
parser/parser.go
1011
parser/parser.go
File diff suppressed because it is too large
Load Diff
@ -28,6 +28,7 @@ func Parse(src io.Reader, fName string) node.Node {
|
||||
token token.Token
|
||||
value string
|
||||
list []node.Node
|
||||
strings []string
|
||||
}
|
||||
|
||||
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
|
||||
@ -207,8 +208,9 @@ func Parse(src io.Reader, fName string) node.Node {
|
||||
|
||||
%type <node> variable_modifiers
|
||||
%type <node> method_modifiers non_empty_member_modifiers member_modifier
|
||||
%type <node> class_modifiers use_type
|
||||
%type <node> use_type
|
||||
|
||||
%type <strings> class_modifiers
|
||||
%type <list> encaps_list backticks_expr namespace_name catch_name_list catch_list
|
||||
|
||||
%%
|
||||
@ -455,27 +457,14 @@ is_variadic:
|
||||
|
||||
class_declaration_statement:
|
||||
class_modifiers T_CLASS T_STRING extends_from implements_list '{' class_statement_list '}'
|
||||
{
|
||||
$$ = node.NewSimpleNode("Class").
|
||||
Attribute("name", $3.String()).
|
||||
Append($1).
|
||||
Append(node.NewSimpleNode("Extends").Append($4)).
|
||||
Append(node.NewSimpleNode("Implements").Append($5)).
|
||||
Append($7);
|
||||
}
|
||||
{ $$ = stmt.NewClass($3, $1, nil, $4, $5, $7) }
|
||||
| T_CLASS T_STRING extends_from implements_list '{' class_statement_list '}'
|
||||
{
|
||||
$$ = node.NewSimpleNode("Class").
|
||||
Attribute("name", $2.String()).
|
||||
Append(node.NewSimpleNode("Extends").Append($3)).
|
||||
Append(node.NewSimpleNode("Implements").Append($4)).
|
||||
Append($6);
|
||||
}
|
||||
{ $$ = stmt.NewClass($2, nil, nil, $3, $4, $6) }
|
||||
;
|
||||
|
||||
class_modifiers:
|
||||
class_modifier { $$ = node.NewSimpleNode("Class").Attribute($1, "true") }
|
||||
| class_modifiers class_modifier { $$ = $1.Attribute($2, "true") }
|
||||
class_modifier { $$ = []string{$1} }
|
||||
| class_modifiers class_modifier { $$ = append($1, $2) }
|
||||
;
|
||||
|
||||
class_modifier:
|
||||
@ -498,7 +487,7 @@ interface_declaration_statement:
|
||||
;
|
||||
|
||||
extends_from:
|
||||
/* empty */ { $$ = node.NewSimpleNode(""); }
|
||||
/* empty */ { $$ = nil }
|
||||
| T_EXTENDS name { $$ = $2; }
|
||||
;
|
||||
|
||||
@ -825,12 +814,7 @@ non_empty_for_exprs:
|
||||
anonymous_class:
|
||||
T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}'
|
||||
{
|
||||
$$ = node.NewSimpleNode("AnonymousClass").
|
||||
Attribute("name", $1.String()).
|
||||
Append($2).
|
||||
Append($3).
|
||||
Append($4).
|
||||
Append($6);
|
||||
{ $$ = stmt.NewClass($1, nil, $2, $3, $4, $6) }
|
||||
}
|
||||
;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user