alt_if nodes and refactor lists
This commit is contained in:
		
							parent
							
								
									5b54987ddc
								
							
						
					
					
						commit
						dbe1e56e2e
					
				
							
								
								
									
										6
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								main.go
									
									
									
									
									
								
							| @ -1,6 +1,7 @@ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| @ -20,7 +21,10 @@ func main() { | ||||
| 
 | ||||
| 		src, _ := os.Open(string(real)) | ||||
| 		rootnode := parser.Parse(src, real) | ||||
| 		fmt.Println(rootnode) | ||||
| 
 | ||||
| 		buf := new(bytes.Buffer) | ||||
| 		rootnode.Print(buf, "") | ||||
| 		fmt.Println(buf.String()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										20
									
								
								node/stmt/alt_else.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								node/stmt/alt_else.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| package stmt | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/z7zmey/php-parser/node" | ||||
| 	"github.com/z7zmey/php-parser/token" | ||||
| ) | ||||
| 
 | ||||
| type AltElse struct { | ||||
| 	Else | ||||
| } | ||||
| 
 | ||||
| func NewAltElse(token token.Token, stmt node.Node) node.Node { | ||||
| 	return AltElse{ | ||||
| 		Else{ | ||||
| 			node.SimpleNode{Name: "AltElse", Attributes: make(map[string]string)}, | ||||
| 			token, | ||||
| 			stmt, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										21
									
								
								node/stmt/alt_else_if.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node/stmt/alt_else_if.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| package stmt | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/z7zmey/php-parser/node" | ||||
| 	"github.com/z7zmey/php-parser/token" | ||||
| ) | ||||
| 
 | ||||
| type AltElseIf struct { | ||||
| 	ElseIf | ||||
| } | ||||
| 
 | ||||
| func NewAltElseIf(token token.Token, cond node.Node, stmt node.Node) node.Node { | ||||
| 	return AltElseIf{ | ||||
| 		ElseIf{ | ||||
| 			node.SimpleNode{Name: "AltElseIf", Attributes: make(map[string]string)}, | ||||
| 			token, | ||||
| 			cond, | ||||
| 			stmt, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										39
									
								
								node/stmt/alt_if.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								node/stmt/alt_if.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| package stmt | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/z7zmey/php-parser/node" | ||||
| 	"github.com/z7zmey/php-parser/token" | ||||
| ) | ||||
| 
 | ||||
| type AltIf struct { | ||||
| 	If | ||||
| } | ||||
| 
 | ||||
| func NewAltIf(token token.Token, cond node.Node, stmt node.Node) node.Node { | ||||
| 	return AltIf{ | ||||
| 		If{ | ||||
| 			node.SimpleNode{Name: "AltIf", Attributes: make(map[string]string)}, | ||||
| 			token, | ||||
| 			cond, | ||||
| 			stmt, | ||||
| 			nil, | ||||
| 			nil, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (n AltIf) 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 AltIf) SetElse(_else node.Node) node.Node { | ||||
| 	n._else = _else | ||||
| 
 | ||||
| 	return n | ||||
| } | ||||
| @ -5,27 +5,22 @@ import ( | ||||
| 	"io" | ||||
| 
 | ||||
| 	"github.com/z7zmey/php-parser/node" | ||||
| 	"github.com/z7zmey/php-parser/token" | ||||
| ) | ||||
| 
 | ||||
| type StmtList struct { | ||||
| 	node.SimpleNode | ||||
| 	openBracket  token.Token | ||||
| 	closeBracket token.Token | ||||
| 	stmts        []node.Node | ||||
| 	stmts []node.Node | ||||
| } | ||||
| 
 | ||||
| func NewStmtList(openBracket token.Token, closeBracket token.Token, stmts []node.Node) node.Node { | ||||
| func NewStmtList(stmts []node.Node) node.Node { | ||||
| 	return StmtList{ | ||||
| 		node.SimpleNode{Name: "StmtList", Attributes: make(map[string]string)}, | ||||
| 		openBracket, | ||||
| 		closeBracket, | ||||
| 		stmts, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (n StmtList) Print(out io.Writer, indent string) { | ||||
| 	fmt.Fprintf(out, "\n%v%v [%d %d]", indent, n.Name, n.openBracket.StartLine, n.closeBracket.EndLine) | ||||
| 	fmt.Fprintf(out, "\n%v%v [- -]", indent, n.Name) | ||||
| 
 | ||||
| 	if n.stmts != nil { | ||||
| 		fmt.Fprintf(out, "\n%vstmts:", indent+"  ") | ||||
|  | ||||
							
								
								
									
										1238
									
								
								parser/parser.go
									
									
									
									
									
								
							
							
						
						
									
										1238
									
								
								parser/parser.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -16,12 +16,12 @@ import ( | ||||
|     "github.com/z7zmey/php-parser/node/expr/cast" | ||||
| ) | ||||
| 
 | ||||
| var rootnode = node.NewSimpleNode("Root") | ||||
| var rootnode = stmt.NewStmtList([]node.Node{}) | ||||
| 
 | ||||
| func Parse(src io.Reader, fName string) node.Node { | ||||
|     yyDebug        = 0 | ||||
|     yyErrorVerbose = true | ||||
|     rootnode = node.NewSimpleNode("Root") //reset | ||||
|     rootnode = stmt.NewStmtList([]node.Node{}) //reset | ||||
|     yyParse(newLexer(src, fName)) | ||||
|     return rootnode | ||||
| } | ||||
| @ -207,11 +207,9 @@ func Parse(src io.Reader, fName string) node.Node { | ||||
| %type <node> variable_class_name dereferencable_scalar constant dereferencable | ||||
| %type <node> callable_expr callable_variable static_member new_variable | ||||
| %type <node> encaps_var encaps_var_offset | ||||
| %type <node> top_statement_list inner_statement_list if_stmt | ||||
| %type <node> alt_if_stmt  | ||||
| %type <node> parameter_list class_statement_list | ||||
| %type <node> if_stmt | ||||
| %type <node> alt_if_stmt | ||||
| %type <node> implements_list if_stmt_without_else | ||||
| %type <node> non_empty_parameter_list | ||||
| %type <node> class_const_decl name_list method_body | ||||
| %type <node> alt_if_stmt_without_else | ||||
| %type <node> array_pair possible_array_pair | ||||
| @ -227,14 +225,15 @@ func Parse(src io.Reader, fName string) node.Node { | ||||
| %type <list> unprefixed_use_declarations inline_use_declarations property_list static_var_list | ||||
| %type <list> switch_case_list case_list trait_adaptation_list trait_adaptations unset_variables | ||||
| %type <list> use_declarations lexical_var_list lexical_vars isset_variables non_empty_array_pair_list | ||||
| %type <list> array_pair_list ctor_arguments argument_list non_empty_argument_list | ||||
| %type <list> array_pair_list ctor_arguments argument_list non_empty_argument_list top_statement_list | ||||
| %type <list> inner_statement_list parameter_list non_empty_parameter_list class_statement_list | ||||
| 
 | ||||
| %% | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////////////////// | ||||
| 
 | ||||
| start: | ||||
|     top_statement_list                                  { rootnode = $1; } | ||||
|     top_statement_list                                  { rootnode = stmt.NewStmtList($1); } | ||||
| ; | ||||
| 
 | ||||
| reserved_non_modifiers: | ||||
| @ -258,8 +257,8 @@ identifier: | ||||
| ; | ||||
| 
 | ||||
| top_statement_list: | ||||
|         top_statement_list top_statement                { $$ = $1.Append($2); } | ||||
|     |   /* empty */                                     { $$ = node.NewSimpleNode("Statements") } | ||||
|         top_statement_list top_statement                { $$ = append($1, $2) } | ||||
|     |   /* empty */                                     { $$ = []node.Node{} } | ||||
| ; | ||||
| 
 | ||||
| namespace_name: | ||||
| @ -282,8 +281,8 @@ top_statement: | ||||
|     |   T_HALT_COMPILER '(' ')' ';'                     { $$ = stmt.NewHaltCompiler($1) } | ||||
|     |   T_NAMESPACE namespace_name ';'                  { $$ = stmt.NewNamespace($1, name.NewName($2), nil) } | ||||
|     |   T_NAMESPACE namespace_name '{' top_statement_list '}' | ||||
|                                                         { $$ = stmt.NewNamespace($1, name.NewName($2), $4.(node.SimpleNode).Children) } | ||||
|     |   T_NAMESPACE '{' top_statement_list '}'          { $$ = stmt.NewNamespace($1, nil, $3.(node.SimpleNode).Children) } | ||||
|                                                         { $$ = stmt.NewNamespace($1, name.NewName($2), $4) } | ||||
|     |   T_NAMESPACE '{' top_statement_list '}'          { $$ = stmt.NewNamespace($1, nil, $3) } | ||||
|     |   T_USE mixed_group_use_declaration ';'           { $$ = $2.(stmt.GroupUse).SetToken($1) } | ||||
|     |   T_USE use_type group_use_declaration ';'        { $$ = $3.(stmt.GroupUse).SetToken($1).(stmt.GroupUse).SetUseType($2) } | ||||
|     |   T_USE use_declarations ';'                      { $$ = stmt.NewUseList($1, nil, $2) } | ||||
| @ -363,8 +362,8 @@ const_list: | ||||
| ; | ||||
| 
 | ||||
| inner_statement_list: | ||||
|         inner_statement_list inner_statement            { $$ = $1.Append($2); } | ||||
|     |   /* empty */                                     { $$ = node.NewSimpleNode("StmtList") } | ||||
|         inner_statement_list inner_statement            { $$ = append($1, $2) } | ||||
|     |   /* empty */                                     { $$ = []node.Node{} } | ||||
| ; | ||||
| 
 | ||||
| inner_statement: | ||||
| @ -376,7 +375,7 @@ inner_statement: | ||||
|     |   T_HALT_COMPILER '(' ')' ';'                     { $$ = stmt.NewHaltCompiler($1) } | ||||
| 
 | ||||
| statement: | ||||
|     '{' inner_statement_list '}'                        { $$ = stmt.NewStmtList($1, $3, $2.(node.SimpleNode).Children) } | ||||
|     '{' inner_statement_list '}'                        { $$ = stmt.NewStmtList($2) } | ||||
|     |   if_stmt                                         { $$ = $1; } | ||||
|     |   alt_if_stmt                                     { $$ = $1; } | ||||
|     |   T_WHILE '(' expr ')' while_statement | ||||
| @ -403,7 +402,7 @@ statement: | ||||
|     |   ';'                                             { $$ = stmt.NewNop($1) } | ||||
|     |   T_TRY '{' inner_statement_list '}' catch_list finally_statement | ||||
|             { | ||||
|                 $$ = stmt.NewTry($1, $3.(node.SimpleNode).Children, $5, $6) | ||||
|                 $$ = stmt.NewTry($1, $3, $5, $6) | ||||
|             } | ||||
|     |   T_THROW expr ';'                                { $$ = stmt.NewThrow($1, $2) } | ||||
|     |   T_GOTO T_STRING ';'                             { $$ = stmt.NewGoto($1, $2) } | ||||
| @ -412,7 +411,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(node.NewIdentifier($5)), $8.(node.SimpleNode).Children)) } | ||||
|                                                         { $$ = append($1, stmt.NewCatch($2, $4, expr.NewVariable(node.NewIdentifier($5)), $8)) } | ||||
| ; | ||||
| catch_name_list: | ||||
|         name                                            { $$ = []node.Node{$1} } | ||||
| @ -421,7 +420,7 @@ catch_name_list: | ||||
| 
 | ||||
| finally_statement: | ||||
|         /* empty */                                     { $$ = nil } | ||||
|     |   T_FINALLY '{' inner_statement_list '}'          { $$ = stmt.NewFinally($1, $3.(node.SimpleNode).Children) } | ||||
|     |   T_FINALLY '{' inner_statement_list '}'          { $$ = stmt.NewFinally($1, $3) } | ||||
| ; | ||||
| 
 | ||||
| unset_variables: | ||||
| @ -436,7 +435,7 @@ unset_variable: | ||||
| function_declaration_statement: | ||||
|     T_FUNCTION returns_ref T_STRING '(' parameter_list ')' return_type '{' inner_statement_list '}' | ||||
|         { | ||||
|             $$ = stmt.NewFunction($3, $2 == "true", $5.(node.SimpleNode).Children, $7, $9.(node.SimpleNode).Children) | ||||
|             $$ = stmt.NewFunction($3, $2 == "true", $5, $7, $9) | ||||
|         } | ||||
| ; | ||||
| 
 | ||||
| @ -452,9 +451,9 @@ is_variadic: | ||||
| 
 | ||||
| class_declaration_statement: | ||||
|         class_modifiers T_CLASS T_STRING extends_from implements_list '{' class_statement_list '}' | ||||
|                                                         { $$ = stmt.NewClass($3, $1, nil, $4, $5.(node.SimpleNode).Children, $7.(node.SimpleNode).Children) } | ||||
|                                                         { $$ = stmt.NewClass($3, $1, nil, $4, $5.(node.SimpleNode).Children, $7) } | ||||
|     |   T_CLASS T_STRING extends_from implements_list '{' class_statement_list '}' | ||||
|                                                         { $$ = stmt.NewClass($2, nil, nil, $3, $4.(node.SimpleNode).Children, $6.(node.SimpleNode).Children) } | ||||
|                                                         { $$ = stmt.NewClass($2, nil, nil, $3, $4.(node.SimpleNode).Children, $6) } | ||||
| ; | ||||
| 
 | ||||
| class_modifiers: | ||||
| @ -468,12 +467,12 @@ class_modifier: | ||||
| ; | ||||
| 
 | ||||
| trait_declaration_statement: | ||||
|     T_TRAIT T_STRING '{' class_statement_list '}'       { $$ = stmt.NewTrait($2, $4.(node.SimpleNode).Children) } | ||||
|     T_TRAIT T_STRING '{' class_statement_list '}'       { $$ = stmt.NewTrait($2, $4) } | ||||
| ; | ||||
| 
 | ||||
| interface_declaration_statement: | ||||
|     T_INTERFACE T_STRING interface_extends_list '{' class_statement_list '}' | ||||
|                                                         { $$ = stmt.NewInterface($1, $2, $3, $5.(node.SimpleNode).Children) } | ||||
|                                                         { $$ = stmt.NewInterface($1, $2, $3, $5) } | ||||
| ; | ||||
| 
 | ||||
| extends_from: | ||||
| @ -500,17 +499,17 @@ foreach_variable: | ||||
| 
 | ||||
| for_statement: | ||||
|         statement                                       { $$ = $1; } | ||||
|     |    ':' inner_statement_list T_ENDFOR ';'          { $$ = $2; } | ||||
|     |    ':' inner_statement_list T_ENDFOR ';'          { $$ = stmt.NewStmtList($2); } | ||||
| ; | ||||
| 
 | ||||
| foreach_statement: | ||||
|         statement                                       { $$ = $1; } | ||||
|     |   ':' inner_statement_list T_ENDFOREACH ';'       { $$ = $2; } | ||||
|     |   ':' inner_statement_list T_ENDFOREACH ';'       { $$ = stmt.NewStmtList($2); } | ||||
| ; | ||||
| 
 | ||||
| declare_statement: | ||||
|         statement                                       { $$ = $1; } | ||||
|     |   ':' inner_statement_list T_ENDDECLARE ';'       { $$ = $2; } | ||||
|     |   ':' inner_statement_list T_ENDDECLARE ';'       { $$ = stmt.NewStmtList($2); } | ||||
| ; | ||||
| 
 | ||||
| switch_case_list: | ||||
| @ -524,11 +523,11 @@ case_list: | ||||
|         /* empty */                                     { $$ = []node.Node{} } | ||||
|     |   case_list T_CASE expr case_separator inner_statement_list | ||||
|             { | ||||
|                 $$ = append($1, stmt.NewCase($2, $3, $5.(node.SimpleNode).Children)) | ||||
|                 $$ = append($1, stmt.NewCase($2, $3, $5)) | ||||
|             } | ||||
|     |   case_list T_DEFAULT case_separator inner_statement_list | ||||
|             { | ||||
|                 $$ = append($1, stmt.NewDefault($2, $4.(node.SimpleNode).Children)) | ||||
|                 $$ = append($1, stmt.NewDefault($2, $4)) | ||||
|             } | ||||
| ; | ||||
| 
 | ||||
| @ -539,7 +538,7 @@ case_separator: | ||||
| 
 | ||||
| while_statement: | ||||
|         statement                                       { $$ = $1; } | ||||
|     |   ':' inner_statement_list T_ENDWHILE ';'         { $$ = $2; } | ||||
|     |   ':' inner_statement_list T_ENDWHILE ';'         { $$ = stmt.NewStmtList($2); } | ||||
| ; | ||||
| 
 | ||||
| if_stmt_without_else: | ||||
| @ -563,15 +562,12 @@ if_stmt: | ||||
| alt_if_stmt_without_else: | ||||
|         T_IF '(' expr ')' ':' inner_statement_list | ||||
|             {  | ||||
|                 $$ = node.NewSimpleNode("AltIf"). | ||||
|                     Append(node.NewSimpleNode("expr").Append($3)). | ||||
|                     Append(node.NewSimpleNode("stmt").Append($6)) | ||||
|                 $$ = stmt.NewAltIf($1, $3, stmt.NewStmtList($6)) | ||||
|             } | ||||
|     |   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))) | ||||
|                 _elseIf := stmt.NewAltElseIf($2, $4, stmt.NewStmtList($7)) | ||||
|                 $$ = $1.(stmt.AltIf).AddElseIf(_elseIf) | ||||
|             } | ||||
| ; | ||||
| 
 | ||||
| @ -579,18 +575,19 @@ alt_if_stmt: | ||||
|         alt_if_stmt_without_else T_ENDIF ';'            { $$ = $1; } | ||||
|     |   alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' | ||||
|             { | ||||
|                 $$ = $1.Append(node.NewSimpleNode("AltElse").Append(node.NewSimpleNode("stmt").Append($4))) | ||||
|                 _else := stmt.NewAltElse($2, stmt.NewStmtList($4)) | ||||
|                 $$ = $1.(stmt.AltIf).SetElse(_else) | ||||
|             } | ||||
| ; | ||||
| 
 | ||||
| parameter_list: | ||||
|         non_empty_parameter_list                        { $$ = $1; } | ||||
|     |   /* empty */                                     { $$ = node.NewSimpleNode("Parameter list"); } | ||||
|     |   /* empty */                                     { $$ = nil } | ||||
| ; | ||||
| 
 | ||||
| non_empty_parameter_list: | ||||
|         parameter                                       { $$ = node.NewSimpleNode("Parameter list").Append($1) } | ||||
|     |   non_empty_parameter_list ',' parameter          { $$ = $1.Append($3); } | ||||
|         parameter                                       { $$ = []node.Node{$1} } | ||||
|     |   non_empty_parameter_list ',' parameter          { $$ = append($1, $3) } | ||||
| ; | ||||
| 
 | ||||
| parameter: | ||||
| @ -669,8 +666,8 @@ static_var: | ||||
| ; | ||||
| 
 | ||||
| class_statement_list: | ||||
|         class_statement_list class_statement            { $$ = $1.Append($2) } | ||||
|     |   /* empty */                                     { $$ = node.NewSimpleNode("Stmt") } | ||||
|         class_statement_list class_statement            { $$ = append($1, $2) } | ||||
|     |   /* empty */                                     { $$ = []node.Node{} } | ||||
| ; | ||||
| 
 | ||||
| class_statement: | ||||
| @ -679,7 +676,7 @@ class_statement: | ||||
|     |   T_USE name_list trait_adaptations               { $$ = stmt.NewTraitUse($1, $2.(node.SimpleNode).Children, $3) } | ||||
|     |   method_modifiers T_FUNCTION returns_ref identifier '(' parameter_list ')' return_type method_body | ||||
|             { | ||||
|                 $$ = stmt.NewClassMethod($4, $1.(node.SimpleNode).Children, $3 == "true", $6.(node.SimpleNode).Children, $8, $9.(node.SimpleNode).Children) | ||||
|                 $$ = stmt.NewClassMethod($4, $1.(node.SimpleNode).Children, $3 == "true", $6, $8, $9.(node.SimpleNode).Children) | ||||
|             } | ||||
| ; | ||||
| 
 | ||||
| @ -732,7 +729,7 @@ absolute_trait_method_reference: | ||||
| 
 | ||||
| method_body: | ||||
|         ';' /* abstract method */                       { $$ = node.NewSimpleNode("") } | ||||
|     |   '{' inner_statement_list '}'                    { $$ = $2; } | ||||
|     |   '{' inner_statement_list '}'                    { $$ = stmt.NewStmtList($2) } | ||||
| ; | ||||
| 
 | ||||
| variable_modifiers: | ||||
| @ -803,7 +800,7 @@ non_empty_for_exprs: | ||||
| anonymous_class: | ||||
|     T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' | ||||
|         { | ||||
|             { $$ = stmt.NewClass($1, nil, $2, $3, $4.(node.SimpleNode).Children, $6.(node.SimpleNode).Children) } | ||||
|             { $$ = stmt.NewClass($1, nil, $2, $3, $4.(node.SimpleNode).Children, $6) } | ||||
|         } | ||||
| ; | ||||
| 
 | ||||
| @ -897,11 +894,11 @@ expr_without_variable: | ||||
|     |   T_YIELD_FROM expr                               { $$ = expr.NewYieldFrom($2) } | ||||
|     |   T_FUNCTION returns_ref '(' parameter_list ')' lexical_vars return_type '{' inner_statement_list '}' | ||||
|             { | ||||
|                 $$ = expr.NewClosure($4.(node.SimpleNode).Children, $6, $7, $9.(node.SimpleNode).Children, false, $2 == "true") | ||||
|                 $$ = expr.NewClosure($4, $6, $7, $9, false, $2 == "true") | ||||
|             } | ||||
|     |   T_STATIC T_FUNCTION returns_ref '(' parameter_list ')' lexical_vars return_type '{' inner_statement_list '}' | ||||
|             { | ||||
|                 $$ = expr.NewClosure($5.(node.SimpleNode).Children, $7, $8, $10.(node.SimpleNode).Children, true, $3 == "true") | ||||
|                 $$ = expr.NewClosure($5, $7, $8, $10, true, $3 == "true") | ||||
|             } | ||||
| ; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user