diff --git a/parser/scanner.go b/parser/scanner.go index 7937e17..3c08d90 100644 --- a/parser/scanner.go +++ b/parser/scanner.go @@ -11,7 +11,6 @@ package parser import ( "bytes" "fmt" - "github.com/z7zmey/php-parser/token" ) @@ -798,7 +797,7 @@ yystate31: switch { default: goto yyabort - case c == '\'': + case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ΓΏ': goto yystate29 } @@ -7597,6 +7596,9 @@ yyrule9: // {BNUM} i := 2 BNUMFOR: for { + if i > len(tb)-1 { + break BNUMFOR + } switch tb[i] { case '0': i++ @@ -7632,6 +7634,9 @@ yyrule11: // {HNUM} i := 2 HNUMFOR: for { + if i > len(tb)-1 { + break HNUMFOR + } switch tb[i] { case '0': i++ @@ -8406,7 +8411,7 @@ yyrule137: // . l.begin(PHP) goto yystate0 } -yyrule138: // [\']([^\\\']*([\\][\'])*)*[\'] +yyrule138: // [\']([^\\\']*([\\].)*)*[\'] { lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))) return T_CONSTANT_ENCAPSED_STRING diff --git a/parser/scanner.l b/parser/scanner.l index e16c610..256292a 100644 --- a/parser/scanner.l +++ b/parser/scanner.l @@ -93,6 +93,9 @@ NEW_LINE (\r|\n|\r\n) tb := l.TokenBytes(nil) i:=2 BNUMFOR:for { + if i > len(tb)-1 { + break BNUMFOR; + } switch tb[i] { case '0': i++; default: break BNUMFOR; @@ -113,6 +116,9 @@ NEW_LINE (\r|\n|\r\n) tb := l.TokenBytes(nil) i:=2 HNUMFOR:for { + if i > len(tb)-1 { + break HNUMFOR; + } switch tb[i] { case '0': i++; default: break HNUMFOR; @@ -254,7 +260,7 @@ NEW_LINE (\r|\n|\r\n) {VAR_NAME} l.begin(PHP);lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))); return T_STRING; . l.ungetN(1);l.begin(PHP) -[\']([^\\\']*([\\][\'])*)*[\'] lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))); return T_CONSTANT_ENCAPSED_STRING; +[\']([^\\\']*([\\].)*)*[\'] lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))); return T_CONSTANT_ENCAPSED_STRING; ` l.begin(BACKQUOTE); lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))); return rune2Class(rune(l.TokenBytes(nil)[0])) ` l.begin(PHP); lval.token = token.NewToken(l.handleNewLine(l.TokenBytes(nil))); return rune2Class(rune(l.TokenBytes(nil)[0]))