#56: now, __halt_compiler(); terminates parsing process
				
					
				
			This commit is contained in:
		
							parent
							
								
									1a495d615b
								
							
						
					
					
						commit
						623a90a418
					
				
							
								
								
									
										1024
									
								
								php5/php5.go
									
									
									
									
									
								
							
							
						
						
									
										1024
									
								
								php5/php5.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -373,6 +373,8 @@ top_statement: | |||||||
|                 yylex.(*Parser).comments.AddFromToken($$, $4, comment.SemiColonToken) |                 yylex.(*Parser).comments.AddFromToken($$, $4, comment.SemiColonToken) | ||||||
| 
 | 
 | ||||||
|                 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) |                 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).Begin(scanner.HALT_COMPILER) | ||||||
|             } |             } | ||||||
|     |   T_NAMESPACE namespace_name ';' |     |   T_NAMESPACE namespace_name ';' | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -120,7 +120,6 @@ func TestPhp5(t *testing.T) { | |||||||
| 		function foo() {} | 		function foo() {} | ||||||
| 
 | 
 | ||||||
| 		function foo() { | 		function foo() { | ||||||
| 			__halt_compiler(); |  | ||||||
| 			function bar() {} | 			function bar() {} | ||||||
| 			class Baz {} | 			class Baz {} | ||||||
| 			return $a; | 			return $a; | ||||||
| @ -132,7 +131,6 @@ func TestPhp5(t *testing.T) { | |||||||
| 		global $a, $b, $$c, ${foo()}; | 		global $a, $b, $$c, ${foo()}; | ||||||
| 		a:  | 		a:  | ||||||
| 		goto a; | 		goto a; | ||||||
| 		__halt_compiler(); |  | ||||||
| 		if ($a) {} | 		if ($a) {} | ||||||
| 		if ($a) {} elseif ($b) {} | 		if ($a) {} elseif ($b) {} | ||||||
| 		if ($a) {} else {} | 		if ($a) {} else {} | ||||||
| @ -411,6 +409,10 @@ func TestPhp5(t *testing.T) { | |||||||
| 		${$a}; | 		${$a}; | ||||||
| 		$foo::{$bar}(); | 		$foo::{$bar}(); | ||||||
| 		$foo::bar; | 		$foo::bar; | ||||||
|  | 
 | ||||||
|  | 		__halt_compiler(); | ||||||
|  | 
 | ||||||
|  | 		parsing process must be terminated | ||||||
| 	` | 	` | ||||||
| 
 | 
 | ||||||
| 	expectedParams := []node.Node{ | 	expectedParams := []node.Node{ | ||||||
| @ -1093,7 +1095,6 @@ func TestPhp5(t *testing.T) { | |||||||
| 				PhpDocComment: "", | 				PhpDocComment: "", | ||||||
| 				FunctionName:  &node.Identifier{Value: "foo"}, | 				FunctionName:  &node.Identifier{Value: "foo"}, | ||||||
| 				Stmts: []node.Node{ | 				Stmts: []node.Node{ | ||||||
| 					&stmt.HaltCompiler{}, |  | ||||||
| 					&stmt.Function{ | 					&stmt.Function{ | ||||||
| 						ReturnsRef:    false, | 						ReturnsRef:    false, | ||||||
| 						PhpDocComment: "", | 						PhpDocComment: "", | ||||||
| @ -1171,7 +1172,6 @@ func TestPhp5(t *testing.T) { | |||||||
| 			&stmt.Goto{ | 			&stmt.Goto{ | ||||||
| 				Label: &node.Identifier{Value: "a"}, | 				Label: &node.Identifier{Value: "a"}, | ||||||
| 			}, | 			}, | ||||||
| 			&stmt.HaltCompiler{}, |  | ||||||
| 			&stmt.If{ | 			&stmt.If{ | ||||||
| 				Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, | 				Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, | ||||||
| 				Stmt: &stmt.StmtList{Stmts: []node.Node{}}, | 				Stmt: &stmt.StmtList{Stmts: []node.Node{}}, | ||||||
| @ -3634,6 +3634,7 @@ func TestPhp5(t *testing.T) { | |||||||
| 					ConstantName: &node.Identifier{Value: "bar"}, | 					ConstantName: &node.Identifier{Value: "bar"}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
|  | 			&stmt.HaltCompiler{}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										800
									
								
								php7/php7.go
									
									
									
									
									
								
							
							
						
						
									
										800
									
								
								php7/php7.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -472,6 +472,8 @@ top_statement: | |||||||
|                 yylex.(*Parser).comments.AddFromToken($$, $4, comment.SemiColonToken) |                 yylex.(*Parser).comments.AddFromToken($$, $4, comment.SemiColonToken) | ||||||
| 
 | 
 | ||||||
|                 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) |                 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).Begin(scanner.HALT_COMPILER) | ||||||
|             } |             } | ||||||
|     |   T_NAMESPACE namespace_name ';' |     |   T_NAMESPACE namespace_name ';' | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -137,7 +137,6 @@ func TestPhp7(t *testing.T) { | |||||||
| 		global $a, $b; | 		global $a, $b; | ||||||
| 		a:  | 		a:  | ||||||
| 		goto a; | 		goto a; | ||||||
| 		__halt_compiler(); |  | ||||||
| 		if ($a) {} | 		if ($a) {} | ||||||
| 		if ($a) {} elseif ($b) {} | 		if ($a) {} elseif ($b) {} | ||||||
| 		if ($a) {} else {} | 		if ($a) {} else {} | ||||||
| @ -379,6 +378,10 @@ func TestPhp7(t *testing.T) { | |||||||
| 		$foo->{$bar[0]}; | 		$foo->{$bar[0]}; | ||||||
| 
 | 
 | ||||||
| 		[1=>&$a, 2=>list($b)]; | 		[1=>&$a, 2=>list($b)]; | ||||||
|  | 
 | ||||||
|  | 		__halt_compiler(); | ||||||
|  | 
 | ||||||
|  | 		parsing process must be terminated | ||||||
| 	` | 	` | ||||||
| 
 | 
 | ||||||
| 	expectedParams := []node.Node{ | 	expectedParams := []node.Node{ | ||||||
| @ -1231,7 +1234,6 @@ func TestPhp7(t *testing.T) { | |||||||
| 			&stmt.Goto{ | 			&stmt.Goto{ | ||||||
| 				Label: &node.Identifier{Value: "a"}, | 				Label: &node.Identifier{Value: "a"}, | ||||||
| 			}, | 			}, | ||||||
| 			&stmt.HaltCompiler{}, |  | ||||||
| 			&stmt.If{ | 			&stmt.If{ | ||||||
| 				Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, | 				Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, | ||||||
| 				Stmt: &stmt.StmtList{Stmts: []node.Node{}}, | 				Stmt: &stmt.StmtList{Stmts: []node.Node{}}, | ||||||
| @ -3218,6 +3220,7 @@ func TestPhp7(t *testing.T) { | |||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
|  | 			&stmt.HaltCompiler{}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -521,7 +521,7 @@ func (l *Lexer) popState() { | |||||||
| 	l.StateStack = l.StateStack[:len-1] | 	l.StateStack = l.StateStack[:len-1] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (l *Lexer) begin(state int) { | func (l *Lexer) Begin(state int) { | ||||||
| 	len := len(l.StateStack) | 	len := len(l.StateStack) | ||||||
| 	l.StateStack = l.StateStack[:len-1] | 	l.StateStack = l.StateStack[:len-1] | ||||||
| 	l.StateStack = append(l.StateStack, state) | 	l.StateStack = append(l.StateStack, state) | ||||||
|  | |||||||
| @ -25,6 +25,7 @@ const ( | |||||||
| 	NOWDOC | 	NOWDOC | ||||||
| 	HEREDOC | 	HEREDOC | ||||||
| 	BACKQUOTE | 	BACKQUOTE | ||||||
|  | 	HALT_COMPILER | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func isValidFirstVarNameRune(r rune) bool { | func isValidFirstVarNameRune(r rune) bool { | ||||||
| @ -65,6 +66,8 @@ yystate0: | |||||||
| 		goto yystart595 | 		goto yystart595 | ||||||
| 	case 10: // start condition: BACKQUOTE | 	case 10: // start condition: BACKQUOTE | ||||||
| 		goto yystart599 | 		goto yystart599 | ||||||
|  | 	case 11: // start condition: HALT_COMPILER | ||||||
|  | 		goto yystart604 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	goto yystate0 // silence unused label error | 	goto yystate0 // silence unused label error | ||||||
| @ -405,6 +408,8 @@ yyAction: | |||||||
| 		goto yyrule166 | 		goto yyrule166 | ||||||
| 	case 167: | 	case 167: | ||||||
| 		goto yyrule167 | 		goto yyrule167 | ||||||
|  | 	case 168: | ||||||
|  | 		goto yyrule168 | ||||||
| 	} | 	} | ||||||
| 	goto yystate1 // silence unused label error | 	goto yystate1 // silence unused label error | ||||||
| yystate1: | yystate1: | ||||||
| @ -7540,6 +7545,23 @@ yystate603: | |||||||
| 		goto yystate549 | 		goto yystate549 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	goto yystate604 // silence unused label error | ||||||
|  | yystate604: | ||||||
|  | 	c = l.Next() | ||||||
|  | yystart604: | ||||||
|  | 	switch { | ||||||
|  | 	default: | ||||||
|  | 		goto yyabort | ||||||
|  | 	case c >= '\x01' && c <= 'ÿ': | ||||||
|  | 		goto yystate605 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | yystate605: | ||||||
|  | 	c = l.Next() | ||||||
|  | 	yyrule = 168 | ||||||
|  | 	l.Mark() | ||||||
|  | 	goto yyrule168 | ||||||
|  | 
 | ||||||
| yyrule1: // [ \t\n\r]+ | yyrule1: // [ \t\n\r]+ | ||||||
| 
 | 
 | ||||||
| 	goto yystate0 | 	goto yystate0 | ||||||
| @ -7568,17 +7590,17 @@ yyrule2: // . | |||||||
| 	} | 	} | ||||||
| yyrule3: // \<\?php([ \t]|{NEW_LINE}) | yyrule3: // \<\?php([ \t]|{NEW_LINE}) | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule4: // \<\? | yyrule4: // \<\? | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule5: // \<\?= | yyrule5: // \<\?= | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return T_ECHO | 		return T_ECHO | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -7588,14 +7610,14 @@ yyrule6: // [ \t\n\r]+ | |||||||
| 	goto yystate0 | 	goto yystate0 | ||||||
| yyrule7: // [;][ \t\n\r]*\?\>{NEW_LINE}? | yyrule7: // [;][ \t\n\r]*\?\>{NEW_LINE}? | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(INITIAL) | 		l.Begin(INITIAL) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return Rune2Class(';') | 		return Rune2Class(';') | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule8: // \?\>{NEW_LINE}? | yyrule8: // \?\>{NEW_LINE}? | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(INITIAL) | 		l.Begin(INITIAL) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return Rune2Class(';') | 		return Rune2Class(';') | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -8452,7 +8474,7 @@ yyrule133: // {VAR_NAME} | |||||||
| 	} | 	} | ||||||
| yyrule134: // -> | yyrule134: // -> | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PROPERTY) | 		l.Begin(PROPERTY) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return T_OBJECT_OPERATOR | 		return T_OBJECT_OPERATOR | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -8468,7 +8490,7 @@ yyrule136: // -> | |||||||
| 	} | 	} | ||||||
| yyrule137: // {VAR_NAME} | yyrule137: // {VAR_NAME} | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return T_STRING | 		return T_STRING | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -8476,7 +8498,7 @@ yyrule137: // {VAR_NAME} | |||||||
| yyrule138: // . | yyrule138: // . | ||||||
| 	{ | 	{ | ||||||
| 		l.ungetChars(1) | 		l.ungetChars(1) | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule139: // [\']([^\\\']*(\\(.|\n))*)*[\'] | yyrule139: // [\']([^\\\']*(\\(.|\n))*)*[\'] | ||||||
| @ -8487,14 +8509,14 @@ yyrule139: // [\']([^\\\']*(\\(.|\n))*)*[\'] | |||||||
| 	} | 	} | ||||||
| yyrule140: // ` | yyrule140: // ` | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(BACKQUOTE) | 		l.Begin(BACKQUOTE) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return Rune2Class(rune(l.TokenBytes(nil)[0])) | 		return Rune2Class(rune(l.TokenBytes(nil)[0])) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule141: // ` | yyrule141: // ` | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return Rune2Class(rune(l.TokenBytes(nil)[0])) | 		return Rune2Class(rune(l.TokenBytes(nil)[0])) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -8526,13 +8548,13 @@ yyrule142: // [b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])) | |||||||
| 		case '\'': | 		case '\'': | ||||||
| 			lblFirst++ | 			lblFirst++ | ||||||
| 			lblLast-- | 			lblLast-- | ||||||
| 			l.begin(NOWDOC) | 			l.Begin(NOWDOC) | ||||||
| 		case '"': | 		case '"': | ||||||
| 			lblFirst++ | 			lblFirst++ | ||||||
| 			lblLast-- | 			lblLast-- | ||||||
| 			l.begin(HEREDOC) | 			l.Begin(HEREDOC) | ||||||
| 		default: | 		default: | ||||||
| 			l.begin(HEREDOC) | 			l.Begin(HEREDOC) | ||||||
| 		} | 		} | ||||||
| 		l.heredocLabel = l.tokenString(tb[lblFirst : lblLast+1]) | 		l.heredocLabel = l.tokenString(tb[lblFirst : lblLast+1]) | ||||||
| 
 | 
 | ||||||
| @ -8549,7 +8571,7 @@ yyrule142: // [b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])) | |||||||
| 			ungetCnt++ | 			ungetCnt++ | ||||||
| 			c = l.Next() | 			c = l.Next() | ||||||
| 			if '\n' == rune(c) || '\r' == rune(c) { | 			if '\n' == rune(c) || '\r' == rune(c) { | ||||||
| 				l.begin(HEREDOC_END) | 				l.Begin(HEREDOC_END) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		l.ungetChars(ungetCnt) | 		l.ungetChars(ungetCnt) | ||||||
| @ -8568,12 +8590,12 @@ yyrule143: // .|[ \t\n\r] | |||||||
| 			} | 			} | ||||||
| 			if '\n' == rune(c) || '\r' == rune(c) { | 			if '\n' == rune(c) || '\r' == rune(c) { | ||||||
| 				if l.heredocLabel+";" == string(searchLabel) { | 				if l.heredocLabel+";" == string(searchLabel) { | ||||||
| 					l.begin(HEREDOC_END) | 					l.Begin(HEREDOC_END) | ||||||
| 					tb = l.ungetChars(len(l.heredocLabel) + 1) | 					tb = l.ungetChars(len(l.heredocLabel) + 1) | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 				if l.heredocLabel == string(searchLabel) { | 				if l.heredocLabel == string(searchLabel) { | ||||||
| 					l.begin(HEREDOC_END) | 					l.Begin(HEREDOC_END) | ||||||
| 					tb = l.ungetChars(len(l.heredocLabel)) | 					tb = l.ungetChars(len(l.heredocLabel)) | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| @ -8589,14 +8611,14 @@ yyrule143: // .|[ \t\n\r] | |||||||
| 	} | 	} | ||||||
| yyrule144: // {VAR_NAME}\; | yyrule144: // {VAR_NAME}\; | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		lval.Token(l.createToken(l.ungetChars(1))) | 		lval.Token(l.createToken(l.ungetChars(1))) | ||||||
| 		return T_END_HEREDOC | 		return T_END_HEREDOC | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
| yyrule145: // {VAR_NAME} | yyrule145: // {VAR_NAME} | ||||||
| 	{ | 	{ | ||||||
| 		l.begin(PHP) | 		l.Begin(PHP) | ||||||
| 		lval.Token(l.createToken(l.Token())) | 		lval.Token(l.createToken(l.Token())) | ||||||
| 		return T_END_HEREDOC | 		return T_END_HEREDOC | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| @ -8774,13 +8796,13 @@ yyrule153: // .|[ \t\n\r] | |||||||
| 				fallthrough | 				fallthrough | ||||||
| 			case '\n': | 			case '\n': | ||||||
| 				if l.heredocLabel+";" == string(searchLabel) { | 				if l.heredocLabel+";" == string(searchLabel) { | ||||||
| 					l.begin(HEREDOC_END) | 					l.Begin(HEREDOC_END) | ||||||
| 					tb = l.ungetChars(len(l.heredocLabel) + 1 + nls) | 					tb = l.ungetChars(len(l.heredocLabel) + 1 + nls) | ||||||
| 					lval.Token(l.createToken(tb)) | 					lval.Token(l.createToken(tb)) | ||||||
| 					return T_ENCAPSED_AND_WHITESPACE | 					return T_ENCAPSED_AND_WHITESPACE | ||||||
| 				} | 				} | ||||||
| 				if l.heredocLabel == string(searchLabel) { | 				if l.heredocLabel == string(searchLabel) { | ||||||
| 					l.begin(HEREDOC_END) | 					l.Begin(HEREDOC_END) | ||||||
| 					tb = l.ungetChars(len(l.heredocLabel) + nls) | 					tb = l.ungetChars(len(l.heredocLabel) + nls) | ||||||
| 					lval.Token(l.createToken(tb)) | 					lval.Token(l.createToken(tb)) | ||||||
| 					return T_ENCAPSED_AND_WHITESPACE | 					return T_ENCAPSED_AND_WHITESPACE | ||||||
| @ -8911,6 +8933,11 @@ yyrule167: // . | |||||||
| 		l.pushState(PHP) | 		l.pushState(PHP) | ||||||
| 		goto yystate0 | 		goto yystate0 | ||||||
| 	} | 	} | ||||||
|  | yyrule168: // .|[ \t\n\r] | ||||||
|  | 	{ | ||||||
|  | 		// do nothing | ||||||
|  | 		goto yystate0 | ||||||
|  | 	} | ||||||
| 	panic("unreachable") | 	panic("unreachable") | ||||||
| 
 | 
 | ||||||
| 	goto yyabort // silence unused label error | 	goto yyabort // silence unused label error | ||||||
|  | |||||||
| @ -13,17 +13,18 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	INITIAL = iota |     INITIAL = iota | ||||||
| 	PHP |     PHP | ||||||
| 	STRING |     STRING | ||||||
| 	STRING_VAR |     STRING_VAR | ||||||
| 	STRING_VAR_INDEX |     STRING_VAR_INDEX | ||||||
| 	STRING_VAR_NAME |     STRING_VAR_NAME | ||||||
| 	PROPERTY |     PROPERTY | ||||||
| 	HEREDOC_END |     HEREDOC_END | ||||||
| 	NOWDOC |     NOWDOC | ||||||
| 	HEREDOC |     HEREDOC | ||||||
| 	BACKQUOTE |     BACKQUOTE | ||||||
|  |     HALT_COMPILER | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func isValidFirstVarNameRune(r rune) bool { | func isValidFirstVarNameRune(r rune) bool { | ||||||
| @ -36,7 +37,7 @@ func (l *Lexer) Lex(lval Lval) int { | |||||||
| 
 | 
 | ||||||
| %} | %} | ||||||
| 
 | 
 | ||||||
| %s PHP STRING STRING_VAR STRING_VAR_INDEX STRING_VAR_NAME PROPERTY HEREDOC_END NOWDOC HEREDOC BACKQUOTE | %s PHP STRING STRING_VAR STRING_VAR_INDEX STRING_VAR_NAME PROPERTY HEREDOC_END NOWDOC HEREDOC BACKQUOTE HALT_COMPILER | ||||||
| 
 | 
 | ||||||
| %yyb last == '\n' || last = '\0' | %yyb last == '\n' || last = '\0' | ||||||
| %yyt l.getCurrentState() | %yyt l.getCurrentState() | ||||||
| @ -84,13 +85,13 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
|     lval.Token(l.createToken(tb)) |     lval.Token(l.createToken(tb)) | ||||||
|     return T_INLINE_HTML |     return T_INLINE_HTML | ||||||
| 
 | 
 | ||||||
| <INITIAL>\<\?php([ \t]|{NEW_LINE})              l.begin(PHP); | <INITIAL>\<\?php([ \t]|{NEW_LINE})              l.Begin(PHP); | ||||||
| <INITIAL>\<\?                                   l.begin(PHP); | <INITIAL>\<\?                                   l.Begin(PHP); | ||||||
| <INITIAL>\<\?=                                  l.begin(PHP);lval.Token(l.createToken(l.Token())); return T_ECHO; | <INITIAL>\<\?=                                  l.Begin(PHP);lval.Token(l.createToken(l.Token())); return T_ECHO; | ||||||
| 
 | 
 | ||||||
| <PHP>[ \t\n\r]+ | <PHP>[ \t\n\r]+ | ||||||
| <PHP>[;][ \t\n\r]*\?\>{NEW_LINE}?               l.begin(INITIAL);lval.Token(l.createToken(l.Token())); return Rune2Class(';'); | <PHP>[;][ \t\n\r]*\?\>{NEW_LINE}?               l.Begin(INITIAL);lval.Token(l.createToken(l.Token())); return Rune2Class(';'); | ||||||
| <PHP>\?\>{NEW_LINE}?                            l.begin(INITIAL);lval.Token(l.createToken(l.Token())); return Rune2Class(';'); | <PHP>\?\>{NEW_LINE}?                            l.Begin(INITIAL);lval.Token(l.createToken(l.Token())); return Rune2Class(';'); | ||||||
| 
 | 
 | ||||||
| <PHP>{DNUM}|{EXPONENT_DNUM}                     lval.Token(l.createToken(l.Token())); return T_DNUMBER | <PHP>{DNUM}|{EXPONENT_DNUM}                     lval.Token(l.createToken(l.Token())); return T_DNUMBER | ||||||
| <PHP>{BNUM} | <PHP>{BNUM} | ||||||
| @ -324,16 +325,16 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
| <PHP>\${VAR_NAME}                               lval.Token(l.createToken(l.Token())); return T_VARIABLE | <PHP>\${VAR_NAME}                               lval.Token(l.createToken(l.Token())); return T_VARIABLE | ||||||
| <PHP>{VAR_NAME}                                 lval.Token(l.createToken(l.Token())); return T_STRING | <PHP>{VAR_NAME}                                 lval.Token(l.createToken(l.Token())); return T_STRING | ||||||
| 
 | 
 | ||||||
| <PHP>->                                         l.begin(PROPERTY);lval.Token(l.createToken(l.Token())); return T_OBJECT_OPERATOR; | <PHP>->                                         l.Begin(PROPERTY);lval.Token(l.createToken(l.Token())); return T_OBJECT_OPERATOR; | ||||||
| <PROPERTY>[ \t\n\r]+ | <PROPERTY>[ \t\n\r]+ | ||||||
| <PROPERTY>->                                    lval.Token(l.createToken(l.Token())); return T_OBJECT_OPERATOR; | <PROPERTY>->                                    lval.Token(l.createToken(l.Token())); return T_OBJECT_OPERATOR; | ||||||
| <PROPERTY>{VAR_NAME}                            l.begin(PHP);lval.Token(l.createToken(l.Token())); return T_STRING; | <PROPERTY>{VAR_NAME}                            l.Begin(PHP);lval.Token(l.createToken(l.Token())); return T_STRING; | ||||||
| <PROPERTY>.                                     l.ungetChars(1);l.begin(PHP) | <PROPERTY>.                                     l.ungetChars(1);l.Begin(PHP) | ||||||
| 
 | 
 | ||||||
| <PHP>[\']([^\\\']*(\\(.|\n))*)*[\']             lval.Token(l.createToken(l.Token())); return T_CONSTANT_ENCAPSED_STRING; | <PHP>[\']([^\\\']*(\\(.|\n))*)*[\']             lval.Token(l.createToken(l.Token())); return T_CONSTANT_ENCAPSED_STRING; | ||||||
| 
 | 
 | ||||||
| <PHP>`                                          l.begin(BACKQUOTE); lval.Token(l.createToken(l.Token())); return Rune2Class(rune(l.TokenBytes(nil)[0])) | <PHP>`                                          l.Begin(BACKQUOTE); lval.Token(l.createToken(l.Token())); return Rune2Class(rune(l.TokenBytes(nil)[0])) | ||||||
| <BACKQUOTE>`                                    l.begin(PHP); lval.Token(l.createToken(l.Token())); return Rune2Class(rune(l.TokenBytes(nil)[0])) | <BACKQUOTE>`                                    l.Begin(PHP); lval.Token(l.createToken(l.Token())); return Rune2Class(rune(l.TokenBytes(nil)[0])) | ||||||
| 
 | 
 | ||||||
| <PHP>[b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])){NEW_LINE} | <PHP>[b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])){NEW_LINE} | ||||||
|     tb := l.Token() |     tb := l.Token() | ||||||
| @ -364,13 +365,13 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
|         case '\'' :  |         case '\'' :  | ||||||
|             lblFirst++ |             lblFirst++ | ||||||
|             lblLast-- |             lblLast-- | ||||||
|             l.begin(NOWDOC) |             l.Begin(NOWDOC) | ||||||
|         case '"' :  |         case '"' :  | ||||||
|             lblFirst++ |             lblFirst++ | ||||||
|             lblLast-- |             lblLast-- | ||||||
|             l.begin(HEREDOC) |             l.Begin(HEREDOC) | ||||||
|         default: |         default: | ||||||
|             l.begin(HEREDOC) |             l.Begin(HEREDOC) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     l.heredocLabel = l.tokenString(tb[lblFirst:lblLast+1]) |     l.heredocLabel = l.tokenString(tb[lblFirst:lblLast+1]) | ||||||
| @ -389,7 +390,7 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
|         ungetCnt++ |         ungetCnt++ | ||||||
|         c = l.Next() |         c = l.Next() | ||||||
|         if '\n' == rune(c) || '\r' == rune(c) { |         if '\n' == rune(c) || '\r' == rune(c) { | ||||||
|             l.begin(HEREDOC_END) |             l.Begin(HEREDOC_END) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -409,13 +410,13 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
| 
 | 
 | ||||||
|         if '\n' == rune(c) || '\r' == rune(c) { |         if '\n' == rune(c) || '\r' == rune(c) { | ||||||
|             if l.heredocLabel + ";" == string(searchLabel) { |             if l.heredocLabel + ";" == string(searchLabel) { | ||||||
|                 l.begin(HEREDOC_END) |                 l.Begin(HEREDOC_END) | ||||||
|                 tb = l.ungetChars(len(l.heredocLabel)+1) |                 tb = l.ungetChars(len(l.heredocLabel)+1) | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if l.heredocLabel == string(searchLabel) { |             if l.heredocLabel == string(searchLabel) { | ||||||
|                 l.begin(HEREDOC_END) |                 l.Begin(HEREDOC_END) | ||||||
|                 tb = l.ungetChars(len(l.heredocLabel)) |                 tb = l.ungetChars(len(l.heredocLabel)) | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| @ -431,8 +432,8 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
|     lval.Token(l.createToken(tb) ) |     lval.Token(l.createToken(tb) ) | ||||||
|     return T_ENCAPSED_AND_WHITESPACE |     return T_ENCAPSED_AND_WHITESPACE | ||||||
| 
 | 
 | ||||||
| <HEREDOC_END>{VAR_NAME}\;                       l.begin(PHP);lval.Token(l.createToken(l.ungetChars(1))); return T_END_HEREDOC | <HEREDOC_END>{VAR_NAME}\;                       l.Begin(PHP);lval.Token(l.createToken(l.ungetChars(1))); return T_END_HEREDOC | ||||||
| <HEREDOC_END>{VAR_NAME}                         l.begin(PHP);lval.Token(l.createToken(l.Token())); return T_END_HEREDOC | <HEREDOC_END>{VAR_NAME}                         l.Begin(PHP);lval.Token(l.createToken(l.Token())); return T_END_HEREDOC | ||||||
| 
 | 
 | ||||||
| <PHP>[b]?[\"] | <PHP>[b]?[\"] | ||||||
|     binPrefix := l.Token()[0].Rune == 'b' |     binPrefix := l.Token()[0].Rune == 'b' | ||||||
| @ -589,14 +590,14 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
| 
 | 
 | ||||||
|             case '\n': |             case '\n': | ||||||
|                 if l.heredocLabel + ";" == string(searchLabel) {  |                 if l.heredocLabel + ";" == string(searchLabel) {  | ||||||
|                     l.begin(HEREDOC_END) |                     l.Begin(HEREDOC_END) | ||||||
|                     tb = l.ungetChars(len(l.heredocLabel)+1+nls) |                     tb = l.ungetChars(len(l.heredocLabel)+1+nls) | ||||||
|                     lval.Token(l.createToken(tb));  |                     lval.Token(l.createToken(tb));  | ||||||
|                     return T_ENCAPSED_AND_WHITESPACE |                     return T_ENCAPSED_AND_WHITESPACE | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if l.heredocLabel == string(searchLabel) {  |                 if l.heredocLabel == string(searchLabel) {  | ||||||
|                     l.begin(HEREDOC_END) |                     l.Begin(HEREDOC_END) | ||||||
|                     tb = l.ungetChars(len(l.heredocLabel)+nls) |                     tb = l.ungetChars(len(l.heredocLabel)+nls) | ||||||
|                     lval.Token(l.createToken(tb));  |                     lval.Token(l.createToken(tb));  | ||||||
|                     return T_ENCAPSED_AND_WHITESPACE |                     return T_ENCAPSED_AND_WHITESPACE | ||||||
| @ -652,6 +653,8 @@ NEW_LINE        (\r|\n|\r\n) | |||||||
| <STRING_VAR_NAME>{VAR_NAME}[\[\}]           l.popState();l.pushState(PHP);lval.Token(l.createToken(l.ungetChars(1))); return T_STRING_VARNAME | <STRING_VAR_NAME>{VAR_NAME}[\[\}]           l.popState();l.pushState(PHP);lval.Token(l.createToken(l.ungetChars(1))); return T_STRING_VARNAME | ||||||
| <STRING_VAR_NAME>.                          l.ungetChars(1);l.popState();l.pushState(PHP) | <STRING_VAR_NAME>.                          l.ungetChars(1);l.popState();l.pushState(PHP) | ||||||
| 
 | 
 | ||||||
|  | <HALT_COMPILER>.|[ \t\n\r]                  // do nothing | ||||||
|  | 
 | ||||||
| %% | %% | ||||||
|     if c, ok := l.Abort(); ok { return int(c) } |     if c, ok := l.Abort(); ok { return int(c) } | ||||||
|     goto yyAction |     goto yyAction | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user