handle backquote statements

This commit is contained in:
vadim 2017-11-20 12:33:18 +02:00
parent 082c846c8e
commit 2b0e0c5f04
2 changed files with 1245 additions and 1084 deletions

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,7 @@ const (
HEREDOC_END HEREDOC_END
NOWDOC NOWDOC
HEREDOC HEREDOC
BACKQUOTE
) )
@ -133,7 +134,7 @@ func (l *lexer) Lex() int { // Lex(lval *yySymType)
%} %}
%s PHP STRING STRING_VAR STRING_VAR_INDEX STRING_VAR_NAME PROPERTY HEREDOC_END NOWDOC HEREDOC %s PHP STRING STRING_VAR STRING_VAR_INDEX STRING_VAR_NAME PROPERTY HEREDOC_END NOWDOC HEREDOC BACKQUOTE
%yyb last == '\n' || last = '\0' %yyb last == '\n' || last = '\0'
%yyt sc %yyt sc
@ -278,6 +279,9 @@ NEW_LINE (\r|\n|\r\n)
<PHP>[\']([^\\\']*([\\][\'])*)*[\'] fmt.Printf("T_CONSTANT_ENCAPSED_STRING: %s\n", l.TokenBytes(nil)); <PHP>[\']([^\\\']*([\\][\'])*)*[\'] fmt.Printf("T_CONSTANT_ENCAPSED_STRING: %s\n", l.TokenBytes(nil));
<PHP>` fmt.Println("`");begin(BACKQUOTE)
<BACKQUOTE>` fmt.Println("`");begin(PHP)
<PHP>[b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])){NEW_LINE} <PHP>[b]?\<\<\<[ \t]*({VAR_NAME}|([']{VAR_NAME}['])|(["]{VAR_NAME}["])){NEW_LINE}
tb := l.TokenBytes(nil) tb := l.TokenBytes(nil)
binPrefix := 0 binPrefix := 0
@ -414,9 +418,9 @@ NEW_LINE (\r|\n|\r\n)
} }
<STRING>\" fmt.Println("\""); popState() <STRING>\" fmt.Println("\""); popState()
<STRING,HEREDOC>\{\$ fmt.Printf("T_CURLY_OPEN: %q\n", l.ungetN(1));pushState(PHP) <STRING,HEREDOC,BACKQUOTE>\{\$ fmt.Printf("T_CURLY_OPEN: %q\n", l.ungetN(1));pushState(PHP)
<STRING,HEREDOC>\$\{ fmt.Printf("T_DOLLAR_OPEN_CURLY_BRACES: %q\n", l.TokenBytes(nil));pushState(STRING_VAR_NAME) <STRING,HEREDOC,BACKQUOTE>\$\{ fmt.Printf("T_DOLLAR_OPEN_CURLY_BRACES: %q\n", l.TokenBytes(nil));pushState(STRING_VAR_NAME)
<STRING,HEREDOC>\$ l.ungetN(1);pushState(STRING_VAR) <STRING,HEREDOC,BACKQUOTE>\$ l.ungetN(1);pushState(STRING_VAR)
<STRING>. <STRING>.
F1:for { F1:for {
if c == -1 { if c == -1 {
@ -455,6 +459,44 @@ NEW_LINE (\r|\n|\r\n)
c = l.Next() c = l.Next()
} }
<BACKQUOTE>.
F2:for {
if c == -1 {
break;
}
switch c {
case '`' :
fmt.Printf("T_ENCAPSED_AND_WHITESPACE: %s\n", l.TokenBytes(nil));
break F2;
case '$':
c = l.Next();
if rune(c) == '{' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z' || c >= '\u007f' && c <= 'ÿ' {
l.ungetN(1)
tb := l.TokenBytes(nil)
fmt.Printf("T_ENCAPSED_AND_WHITESPACE: %s\n", tb[:len(tb)-1]);
break F2;
}
l.ungetN(0)
case '{':
c = l.Next();
if rune(c) == '$' {
l.ungetN(1)
tb := l.TokenBytes(nil)
fmt.Printf("T_ENCAPSED_AND_WHITESPACE: %s\n", tb[:len(tb)-1]);
break F2;
}
l.ungetN(0)
case '\\':
c = l.Next();
}
c = l.Next()
}
<HEREDOC>.|[ \t\n\r] <HEREDOC>.|[ \t\n\r]
searchLabel := []byte{} searchLabel := []byte{}
tb := []byte{} tb := []byte{}