diff --git a/internal/php7/parser.go b/internal/php7/parser.go index f9530cc..a910f9c 100644 --- a/internal/php7/parser.go +++ b/internal/php7/parser.go @@ -38,7 +38,7 @@ func (p *Parser) Error(msg string) { if p.errHandlerFunc == nil { return } - + var pos = p.currentToken.Position p.errHandlerFunc(errors.NewError(msg, &pos)) } diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index 86a2eb1..2a9bc8d 100644 Binary files a/internal/scanner/scanner.go and b/internal/scanner/scanner.go differ diff --git a/internal/scanner/scanner.rl b/internal/scanner/scanner.rl index a45c164..b1c1083 100644 --- a/internal/scanner/scanner.rl +++ b/internal/scanner/scanner.rl @@ -408,10 +408,10 @@ func (lex *Lexer) Lex() *Token { *|; backqote := |* - "{$" => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;}; - "${" => {lex.setTokenPosition(token); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;}; - "$" => {lex.ungetCnt(1); fcall string_var;}; - '`' => {lex.setTokenPosition(token); tok = TokenID(int('`')); fnext php; fbreak;}; + "{$" => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;}; + "${" => {lex.setTokenPosition(token); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;}; + "$" varname_first => {lex.ungetCnt(2); fcall string_var;}; + '`' => {lex.setTokenPosition(token); tok = TokenID(int('`')); fnext php; fbreak;}; any_line* when is_not_backqoute_end_or_var => { lex.setTokenPosition(token); tok = T_ENCAPSED_AND_WHITESPACE; @@ -420,10 +420,10 @@ func (lex *Lexer) Lex() *Token { *|; template_string := |* - "{$" => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;}; - "${" => {lex.setTokenPosition(token); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;}; - "$" => {lex.ungetCnt(1); fcall string_var;}; - '"' => {lex.setTokenPosition(token); tok = TokenID(int('"')); fnext php; fbreak;}; + "{$" => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;}; + "${" => {lex.setTokenPosition(token); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;}; + "$" varname_first => {lex.ungetCnt(2); fcall string_var;}; + '"' => {lex.setTokenPosition(token); tok = TokenID(int('"')); fnext php; fbreak;}; any_line* when is_not_string_end_or_var => { lex.setTokenPosition(token); tok = T_ENCAPSED_AND_WHITESPACE; diff --git a/internal/scanner/scanner_test.go b/internal/scanner/scanner_test.go index c05a527..530f972 100644 --- a/internal/scanner/scanner_test.go +++ b/internal/scanner/scanner_test.go @@ -586,6 +586,8 @@ func TestTeplateStringTokens(t *testing.T) { "$/$foo" "$0$foo" + + "$foo$" ` expected := []string{ @@ -641,6 +643,11 @@ func TestTeplateStringTokens(t *testing.T) { T_ENCAPSED_AND_WHITESPACE.String(), T_VARIABLE.String(), TokenID(int('"')).String(), + + TokenID(int('"')).String(), + T_VARIABLE.String(), + T_ENCAPSED_AND_WHITESPACE.String(), + TokenID(int('"')).String(), } lexer := NewLexer([]byte(src), "7.4", false, nil) @@ -671,6 +678,7 @@ func TestBackquoteStringTokens(t *testing.T) { ` + "`$foo/100`" + ` ` + "`$/$foo`" + ` ` + "`$0$foo`" + ` + ` + "`$foo$`" + ` ` expected := []string{ @@ -726,6 +734,11 @@ func TestBackquoteStringTokens(t *testing.T) { T_ENCAPSED_AND_WHITESPACE.String(), T_VARIABLE.String(), TokenID(int('`')).String(), + + TokenID(int('`')).String(), + T_VARIABLE.String(), + T_ENCAPSED_AND_WHITESPACE.String(), + TokenID(int('`')).String(), } lexer := NewLexer([]byte(src), "7.4", false, nil)