nodes try catch finally
This commit is contained in:
parent
059275b3bf
commit
6fd73af4a1
@ -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) {
|
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%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 {
|
for _, nn := range n.types {
|
||||||
nn.Print(out, indent+" ")
|
nn.Print(out, indent+" ")
|
||||||
}
|
}
|
||||||
|
31
node/stmt/finally.go
Normal file
31
node/stmt/finally.go
Normal 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
43
node/stmt/try.go
Normal 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+" ")
|
||||||
|
}
|
855
parser/parser.go
855
parser/parser.go
File diff suppressed because it is too large
Load Diff
@ -194,7 +194,7 @@ func Parse(src io.Reader, fName string) node.Node {
|
|||||||
%type <node> encaps_var encaps_var_offset isset_variables
|
%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> 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> 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> implements_list case_list if_stmt_without_else
|
||||||
%type <node> non_empty_parameter_list argument_list non_empty_argument_list property_list
|
%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
|
%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> method_modifiers non_empty_member_modifiers member_modifier
|
||||||
%type <node> class_modifiers use_type
|
%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(""); }
|
| ';' /* empty statement */ { $$ = node.NewSimpleNode(""); }
|
||||||
| T_TRY '{' inner_statement_list '}' catch_list finally_statement
|
| T_TRY '{' inner_statement_list '}' catch_list finally_statement
|
||||||
{
|
{
|
||||||
$$ = node.NewSimpleNode("Try").
|
$$ = stmt.NewTry($1, $3, $5, $6)
|
||||||
Append($3).
|
|
||||||
Append($5).
|
|
||||||
Append($6);
|
|
||||||
}
|
}
|
||||||
| T_THROW expr ';' { $$ = node.NewSimpleNode("Throw").Append($2) }
|
| T_THROW expr ';' { $$ = node.NewSimpleNode("Throw").Append($2) }
|
||||||
| T_GOTO T_STRING ';' { $$ = node.NewSimpleNode("GoTo").Attribute("Label", $2.String()) }
|
| T_GOTO T_STRING ';' { $$ = node.NewSimpleNode("GoTo").Attribute("Label", $2.String()) }
|
||||||
| T_STRING ':' { $$ = node.NewSimpleNode("Label").Attribute("name", $1.String()) }
|
| T_STRING ':' { $$ = node.NewSimpleNode("Label").Attribute("name", $1.String()) }
|
||||||
|
|
||||||
catch_list:
|
catch_list:
|
||||||
/* empty */ { $$ = node.NewSimpleNode("CatchList") }
|
/* empty */ { $$ = []node.Node{} }
|
||||||
| catch_list T_CATCH '(' catch_name_list T_VARIABLE ')' '{' inner_statement_list '}'
|
| 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:
|
catch_name_list:
|
||||||
name { $$ = []node.Node{$1} }
|
name { $$ = []node.Node{$1} }
|
||||||
@ -421,7 +418,7 @@ catch_name_list:
|
|||||||
|
|
||||||
finally_statement:
|
finally_statement:
|
||||||
/* empty */ { $$ = node.NewSimpleNode(""); }
|
/* empty */ { $$ = node.NewSimpleNode(""); }
|
||||||
| T_FINALLY '{' inner_statement_list '}' { $$ = node.NewSimpleNode("Finnaly").Append($3) }
|
| T_FINALLY '{' inner_statement_list '}' { $$ = stmt.NewFinally($1, $3) }
|
||||||
;
|
;
|
||||||
|
|
||||||
unset_variables:
|
unset_variables:
|
||||||
|
Loading…
Reference in New Issue
Block a user