nodes try catch finally

This commit is contained in:
vadim 2017-12-06 14:47:17 +02:00
parent 059275b3bf
commit 6fd73af4a1
5 changed files with 507 additions and 439 deletions

View File

@ -30,7 +30,7 @@ func NewCatch(token token.Token, types []node.Node, variable node.Node, stmts no
func (n Catch) 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%vtyps:", indent+" ")
fmt.Fprintf(out, "\n%vtypes:", indent+" ")
for _, nn := range n.types {
nn.Print(out, indent+" ")
}

31
node/stmt/finally.go Normal file
View File

@ -0,0 +1,31 @@
package stmt
import (
"fmt"
"io"
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/token"
)
type Finally struct {
node.SimpleNode
token token.Token
stmts node.Node
}
//TODO: stmts myst be []node.Node
func NewFinally(token token.Token, stmts node.Node) node.Node {
return Finally{
node.SimpleNode{Name: "Finally", Attributes: make(map[string]string)},
token,
stmts,
}
}
func (n Finally) 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%vstmts:", indent+" ")
n.stmts.Print(out, indent+" ")
}

43
node/stmt/try.go Normal file
View File

@ -0,0 +1,43 @@
package stmt
import (
"fmt"
"io"
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/token"
)
type Try struct {
node.SimpleNode
token token.Token
stmts node.Node
catches []node.Node
finally node.Node
}
//TODO: stmts myst be []node.Node
func NewTry(token token.Token, stmts node.Node, catches []node.Node, finally node.Node) node.Node {
return Try{
node.SimpleNode{Name: "Try", Attributes: make(map[string]string)},
token,
stmts,
catches,
finally,
}
}
func (n Try) 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%vstmts:", indent+" ")
n.stmts.Print(out, indent+" ")
fmt.Fprintf(out, "\n%vcatches:", indent+" ")
for _, nn := range n.catches {
nn.Print(out, indent+" ")
}
fmt.Fprintf(out, "\n%vfinally:", indent+" ")
n.finally.Print(out, indent+" ")
}

File diff suppressed because it is too large Load Diff

View File

@ -194,7 +194,7 @@ func Parse(src io.Reader, fName string) node.Node {
%type <node> encaps_var encaps_var_offset isset_variables
%type <node> top_statement_list use_declarations const_list inner_statement_list if_stmt
%type <node> alt_if_stmt for_exprs switch_case_list global_var_list static_var_list
%type <node> echo_expr_list unset_variables catch_list parameter_list class_statement_list
%type <node> echo_expr_list unset_variables parameter_list class_statement_list
%type <node> implements_list case_list if_stmt_without_else
%type <node> non_empty_parameter_list argument_list non_empty_argument_list property_list
%type <node> class_const_list class_const_decl name_list trait_adaptations method_body non_empty_for_exprs
@ -208,7 +208,7 @@ func Parse(src io.Reader, fName string) node.Node {
%type <node> method_modifiers non_empty_member_modifiers member_modifier
%type <node> class_modifiers use_type
%type <list> encaps_list backticks_expr namespace_name catch_name_list
%type <list> encaps_list backticks_expr namespace_name catch_name_list catch_list
%%
@ -400,19 +400,16 @@ statement:
| ';' /* empty statement */ { $$ = node.NewSimpleNode(""); }
| T_TRY '{' inner_statement_list '}' catch_list finally_statement
{
$$ = node.NewSimpleNode("Try").
Append($3).
Append($5).
Append($6);
$$ = stmt.NewTry($1, $3, $5, $6)
}
| T_THROW expr ';' { $$ = node.NewSimpleNode("Throw").Append($2) }
| T_GOTO T_STRING ';' { $$ = node.NewSimpleNode("GoTo").Attribute("Label", $2.String()) }
| T_STRING ':' { $$ = node.NewSimpleNode("Label").Attribute("name", $1.String()) }
catch_list:
/* empty */ { $$ = node.NewSimpleNode("CatchList") }
/* empty */ { $$ = []node.Node{} }
| catch_list T_CATCH '(' catch_name_list T_VARIABLE ')' '{' inner_statement_list '}'
{ $$ = $1.Append(stmt.NewCatch($2, $4, node.NewSimpleNode("TODO: handle variable"), $8)) }
{ $$ = append($1, stmt.NewCatch($2, $4, node.NewSimpleNode("TODO: handle variable"), $8)) }
;
catch_name_list:
name { $$ = []node.Node{$1} }
@ -421,7 +418,7 @@ catch_name_list:
finally_statement:
/* empty */ { $$ = node.NewSimpleNode(""); }
| T_FINALLY '{' inner_statement_list '}' { $$ = node.NewSimpleNode("Finnaly").Append($3) }
| T_FINALLY '{' inner_statement_list '}' { $$ = stmt.NewFinally($1, $3) }
;
unset_variables: