if elseif else nodes
This commit is contained in:
		
							parent
							
								
									1bc9802382
								
							
						
					
					
						commit
						9608147c51
					
				
							
								
								
									
										34
									
								
								node/stmt/else.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node/stmt/else.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package stmt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 
 | ||||||
|  | 	"github.com/z7zmey/php-parser/node" | ||||||
|  | 	"github.com/z7zmey/php-parser/token" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Else struct { | ||||||
|  | 	node.SimpleNode | ||||||
|  | 	token token.Token | ||||||
|  | 	stmts []node.Node | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewElse(token token.Token, stmts []node.Node) node.Node { | ||||||
|  | 	return Else{ | ||||||
|  | 		node.SimpleNode{Name: "Else", Attributes: make(map[string]string)}, | ||||||
|  | 		token, | ||||||
|  | 		stmts, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (n Else) 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.stmts != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%vstmts:", indent+"  ") | ||||||
|  | 		for _, nn := range n.stmts { | ||||||
|  | 			nn.Print(out, indent+"    ") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										41
									
								
								node/stmt/else_if.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								node/stmt/else_if.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | package stmt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 
 | ||||||
|  | 	"github.com/z7zmey/php-parser/node" | ||||||
|  | 	"github.com/z7zmey/php-parser/token" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ElseIf struct { | ||||||
|  | 	node.SimpleNode | ||||||
|  | 	token token.Token | ||||||
|  | 	cond  node.Node | ||||||
|  | 	stmts []node.Node | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewElseIf(token token.Token, cond node.Node, stmts []node.Node) node.Node { | ||||||
|  | 	return ElseIf{ | ||||||
|  | 		node.SimpleNode{Name: "ElseIf", Attributes: make(map[string]string)}, | ||||||
|  | 		token, | ||||||
|  | 		cond, | ||||||
|  | 		stmts, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (n ElseIf) 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.cond != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%vcond:", indent+"  ") | ||||||
|  | 		n.cond.Print(out, indent+"    ") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if n.stmts != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%vstmts:", indent+"  ") | ||||||
|  | 		for _, nn := range n.stmts { | ||||||
|  | 			nn.Print(out, indent+"    ") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										72
									
								
								node/stmt/if.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								node/stmt/if.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | |||||||
|  | package stmt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 
 | ||||||
|  | 	"github.com/z7zmey/php-parser/node" | ||||||
|  | 	"github.com/z7zmey/php-parser/token" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type If struct { | ||||||
|  | 	node.SimpleNode | ||||||
|  | 	token  token.Token | ||||||
|  | 	cond   node.Node | ||||||
|  | 	stmts  []node.Node | ||||||
|  | 	elseIf []node.Node | ||||||
|  | 	_else  node.Node | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewIf(token token.Token, cond node.Node, stmts []node.Node) node.Node { | ||||||
|  | 	return If{ | ||||||
|  | 		node.SimpleNode{Name: "If", Attributes: make(map[string]string)}, | ||||||
|  | 		token, | ||||||
|  | 		cond, | ||||||
|  | 		stmts, | ||||||
|  | 		nil, | ||||||
|  | 		nil, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (n If) AddElseIf(elseIf node.Node) node.Node { | ||||||
|  | 	if (n.elseIf == nil) { | ||||||
|  | 		n.elseIf = make([]node.Node, 0) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	n.elseIf = append(n.elseIf, elseIf) | ||||||
|  | 
 | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (n If) SetElse(_else node.Node) node.Node { | ||||||
|  | 	n._else = _else | ||||||
|  | 
 | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (n If) 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.cond != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%vcond:", indent+"  ") | ||||||
|  | 		n.cond.Print(out, indent+"    ") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if n.stmts != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%vstmts:", indent+"  ") | ||||||
|  | 		for _, nn := range n.stmts { | ||||||
|  | 			nn.Print(out, indent+"    ") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if n.elseIf != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%velseIfs:", indent+"  ") | ||||||
|  | 		for _, nn := range n.elseIf { | ||||||
|  | 			nn.Print(out, indent+"    ") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if n._else != nil { | ||||||
|  | 		fmt.Fprintf(out, "\n%velse:", indent+"  ") | ||||||
|  | 		n._else.Print(out, indent+"    ") | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										588
									
								
								parser/parser.go
									
									
									
									
									
								
							
							
						
						
									
										588
									
								
								parser/parser.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -549,13 +549,11 @@ while_statement: | |||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
| if_stmt_without_else: | if_stmt_without_else: | ||||||
|         T_IF '(' expr ')' statement |         T_IF '(' expr ')' statement                     { $$ = stmt.NewIf($1, $3, $5.(node.SimpleNode).Children) } | ||||||
|             { |  | ||||||
|                 $$ = node.NewSimpleNode("If").Append(node.NewSimpleNode("expr").Append($3)).Append(node.NewSimpleNode("stmt").Append($5)) |  | ||||||
|             } |  | ||||||
|     |   if_stmt_without_else T_ELSEIF '(' expr ')' statement |     |   if_stmt_without_else T_ELSEIF '(' expr ')' statement | ||||||
|             {  |             {  | ||||||
|                 $$ = $1.Append(node.NewSimpleNode("ElseIf").Append(node.NewSimpleNode("expr").Append($4)).Append(node.NewSimpleNode("stmt").Append($6))) |                 _elseIf := stmt.NewElseIf($2, $4, $6.(node.SimpleNode).Children) | ||||||
|  |                 $$ = $1.(stmt.If).AddElseIf(_elseIf) | ||||||
|             } |             } | ||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
| @ -563,18 +561,23 @@ if_stmt: | |||||||
|         if_stmt_without_else %prec T_NOELSE             { $$ = $1; } |         if_stmt_without_else %prec T_NOELSE             { $$ = $1; } | ||||||
|     |   if_stmt_without_else T_ELSE statement |     |   if_stmt_without_else T_ELSE statement | ||||||
|             { |             { | ||||||
|                 $$ = $1.Append(node.NewSimpleNode("Else").Append(node.NewSimpleNode("stmt").Append($3))) |                 _else := stmt.NewElse($2, $3.(node.SimpleNode).Children) | ||||||
|  |                 $$ = $1.(stmt.If).SetElse(_else) | ||||||
|             } |             } | ||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
| alt_if_stmt_without_else: | alt_if_stmt_without_else: | ||||||
|         T_IF '(' expr ')' ':' inner_statement_list |         T_IF '(' expr ')' ':' inner_statement_list | ||||||
|             {  |             {  | ||||||
|                 $$ = node.NewSimpleNode("AltIf").Append(node.NewSimpleNode("expr").Append($3)).Append(node.NewSimpleNode("stmt").Append($6)) |                 $$ = node.NewSimpleNode("AltIf"). | ||||||
|  |                     Append(node.NewSimpleNode("expr").Append($3)). | ||||||
|  |                     Append(node.NewSimpleNode("stmt").Append($6)) | ||||||
|             } |             } | ||||||
|     |   alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list |     |   alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list | ||||||
|             { |             { | ||||||
|                 $$ = $1.Append(node.NewSimpleNode("AltElseIf").Append(node.NewSimpleNode("expr").Append($4)).Append(node.NewSimpleNode("stmt").Append($7))) |                 $$ = $1.Append(node.NewSimpleNode("AltElseIf"). | ||||||
|  |                     Append(node.NewSimpleNode("expr").Append($4)). | ||||||
|  |                     Append(node.NewSimpleNode("stmt").Append($7))) | ||||||
|             } |             } | ||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user