scanner refactoring
This commit is contained in:
parent
498e93d178
commit
d2c76460ab
@ -75,18 +75,11 @@ func (l *Lexer) SetErrors(e []*errors.Error) {
|
||||
l.Errors = e
|
||||
}
|
||||
|
||||
func (lex *Lexer) createToken(lval Lval) *Token {
|
||||
token := lex.TokenPool.Get()
|
||||
token.FreeFloating = lex.FreeFloating
|
||||
token.Value = string(lex.data[lex.ts:lex.te])
|
||||
|
||||
func (lex *Lexer) setTokenPosition(token *Token) {
|
||||
token.StartLine = lex.NewLines.GetLine(lex.ts)
|
||||
token.EndLine = lex.NewLines.GetLine(lex.te - 1)
|
||||
token.StartPos = lex.ts
|
||||
token.EndPos = lex.te
|
||||
|
||||
lval.Token(token)
|
||||
return token
|
||||
}
|
||||
|
||||
func (lex *Lexer) addFreeFloating(t freefloating.StringType, ps, pe int) {
|
||||
|
1214
scanner/scanner.go
1214
scanner/scanner.go
File diff suppressed because it is too large
Load Diff
@ -32,6 +32,10 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
eof := lex.pe
|
||||
var tok TokenID
|
||||
|
||||
token := lex.TokenPool.Get()
|
||||
token.FreeFloating = lex.FreeFloating
|
||||
token.Value = string(lex.data[0:0])
|
||||
|
||||
lblStart := 0
|
||||
lblEnd := 0
|
||||
|
||||
@ -130,7 +134,7 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
main := |*
|
||||
any_line+ -- '<?' => {
|
||||
lex.ungetStr("<")
|
||||
lex.createToken(lval)
|
||||
lex.setTokenPosition(token)
|
||||
tok = T_INLINE_HTML;
|
||||
fbreak;
|
||||
};
|
||||
@ -144,7 +148,7 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
fnext php;
|
||||
};
|
||||
'<?='i => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_ECHO;
|
||||
fnext php;
|
||||
fbreak;
|
||||
@ -153,10 +157,10 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
|
||||
php := |*
|
||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||
'?>' newline? => {lex.createToken(lval); tok = TokenID(int(';')); fnext main; fbreak;};
|
||||
';' whitespace_line* '?>' newline? => {lex.createToken(lval); tok = TokenID(int(';')); fnext main; fbreak;};
|
||||
'?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext main; fbreak;};
|
||||
';' whitespace_line* '?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext main; fbreak;};
|
||||
|
||||
(dnum | exponent_dnum) => {lex.createToken(lval); tok = T_DNUMBER; fbreak;};
|
||||
(dnum | exponent_dnum) => {lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;};
|
||||
bnum => {
|
||||
firstNum := 2
|
||||
for i := lex.ts + 2; i < lex.te; i++ {
|
||||
@ -166,15 +170,15 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
}
|
||||
|
||||
if lex.te - lex.ts - firstNum < 64 {
|
||||
lex.createToken(lval); tok = T_LNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_LNUMBER; fbreak;
|
||||
}
|
||||
lex.createToken(lval); tok = T_DNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;
|
||||
};
|
||||
lnum => {
|
||||
if lex.te - lex.ts < 20 {
|
||||
lex.createToken(lval); tok = T_LNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_LNUMBER; fbreak;
|
||||
}
|
||||
lex.createToken(lval); tok = T_DNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;
|
||||
};
|
||||
hnum => {
|
||||
firstNum := lex.ts + 2
|
||||
@ -186,125 +190,125 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
|
||||
length := lex.te - firstNum
|
||||
if length < 16 || (length == 16 && lex.data[firstNum] <= '7') {
|
||||
lex.createToken(lval); tok = T_LNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_LNUMBER; fbreak;
|
||||
}
|
||||
lex.createToken(lval); tok = T_DNUMBER; fbreak;
|
||||
lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;
|
||||
};
|
||||
|
||||
'abstract'i => {lex.createToken(lval); tok = T_ABSTRACT; fbreak;};
|
||||
'array'i => {lex.createToken(lval); tok = T_ARRAY; fbreak;};
|
||||
'as'i => {lex.createToken(lval); tok = T_AS; fbreak;};
|
||||
'break'i => {lex.createToken(lval); tok = T_BREAK; fbreak;};
|
||||
'callable'i => {lex.createToken(lval); tok = T_CALLABLE; fbreak;};
|
||||
'case'i => {lex.createToken(lval); tok = T_CASE; fbreak;};
|
||||
'catch'i => {lex.createToken(lval); tok = T_CATCH; fbreak;};
|
||||
'class'i => {lex.createToken(lval); tok = T_CLASS; fbreak;};
|
||||
'clone'i => {lex.createToken(lval); tok = T_CLONE; fbreak;};
|
||||
'const'i => {lex.createToken(lval); tok = T_CONST; fbreak;};
|
||||
'continue'i => {lex.createToken(lval); tok = T_CONTINUE; fbreak;};
|
||||
'declare'i => {lex.createToken(lval); tok = T_DECLARE; fbreak;};
|
||||
'default'i => {lex.createToken(lval); tok = T_DEFAULT; fbreak;};
|
||||
'do'i => {lex.createToken(lval); tok = T_DO; fbreak;};
|
||||
'echo'i => {lex.createToken(lval); tok = T_ECHO; fbreak;};
|
||||
'else'i => {lex.createToken(lval); tok = T_ELSE; fbreak;};
|
||||
'elseif'i => {lex.createToken(lval); tok = T_ELSEIF; fbreak;};
|
||||
'empty'i => {lex.createToken(lval); tok = T_EMPTY; fbreak;};
|
||||
'enddeclare'i => {lex.createToken(lval); tok = T_ENDDECLARE; fbreak;};
|
||||
'endfor'i => {lex.createToken(lval); tok = T_ENDFOR; fbreak;};
|
||||
'endforeach'i => {lex.createToken(lval); tok = T_ENDFOREACH; fbreak;};
|
||||
'endif'i => {lex.createToken(lval); tok = T_ENDIF; fbreak;};
|
||||
'endswitch'i => {lex.createToken(lval); tok = T_ENDSWITCH; fbreak;};
|
||||
'endwhile'i => {lex.createToken(lval); tok = T_ENDWHILE; fbreak;};
|
||||
'eval'i => {lex.createToken(lval); tok = T_EVAL; fbreak;};
|
||||
'exit'i | 'die'i => {lex.createToken(lval); tok = T_EXIT; fbreak;};
|
||||
'extends'i => {lex.createToken(lval); tok = T_EXTENDS; fbreak;};
|
||||
'final'i => {lex.createToken(lval); tok = T_FINAL; fbreak;};
|
||||
'finally'i => {lex.createToken(lval); tok = T_FINALLY; fbreak;};
|
||||
'for'i => {lex.createToken(lval); tok = T_FOR; fbreak;};
|
||||
'foreach'i => {lex.createToken(lval); tok = T_FOREACH; fbreak;};
|
||||
'function'i | 'cfunction'i => {lex.createToken(lval); tok = T_FUNCTION; fbreak;};
|
||||
'global'i => {lex.createToken(lval); tok = T_GLOBAL; fbreak;};
|
||||
'goto'i => {lex.createToken(lval); tok = T_GOTO; fbreak;};
|
||||
'if'i => {lex.createToken(lval); tok = T_IF; fbreak;};
|
||||
'isset'i => {lex.createToken(lval); tok = T_ISSET; fbreak;};
|
||||
'implements'i => {lex.createToken(lval); tok = T_IMPLEMENTS; fbreak;};
|
||||
'instanceof'i => {lex.createToken(lval); tok = T_INSTANCEOF; fbreak;};
|
||||
'insteadof'i => {lex.createToken(lval); tok = T_INSTEADOF; fbreak;};
|
||||
'interface'i => {lex.createToken(lval); tok = T_INTERFACE; fbreak;};
|
||||
'list'i => {lex.createToken(lval); tok = T_LIST; fbreak;};
|
||||
'namespace'i => {lex.createToken(lval); tok = T_NAMESPACE; fbreak;};
|
||||
'private'i => {lex.createToken(lval); tok = T_PRIVATE; fbreak;};
|
||||
'public'i => {lex.createToken(lval); tok = T_PUBLIC; fbreak;};
|
||||
'print'i => {lex.createToken(lval); tok = T_PRINT; fbreak;};
|
||||
'protected'i => {lex.createToken(lval); tok = T_PROTECTED; fbreak;};
|
||||
'return'i => {lex.createToken(lval); tok = T_RETURN; fbreak;};
|
||||
'static'i => {lex.createToken(lval); tok = T_STATIC; fbreak;};
|
||||
'switch'i => {lex.createToken(lval); tok = T_SWITCH; fbreak;};
|
||||
'throw'i => {lex.createToken(lval); tok = T_THROW; fbreak;};
|
||||
'trait'i => {lex.createToken(lval); tok = T_TRAIT; fbreak;};
|
||||
'try'i => {lex.createToken(lval); tok = T_TRY; fbreak;};
|
||||
'unset'i => {lex.createToken(lval); tok = T_UNSET; fbreak;};
|
||||
'use'i => {lex.createToken(lval); tok = T_USE; fbreak;};
|
||||
'var'i => {lex.createToken(lval); tok = T_VAR; fbreak;};
|
||||
'while'i => {lex.createToken(lval); tok = T_WHILE; fbreak;};
|
||||
'yield'i whitespace_line* 'from'i => {lex.createToken(lval); tok = T_YIELD_FROM; fbreak;};
|
||||
'yield'i => {lex.createToken(lval); tok = T_YIELD; fbreak;};
|
||||
'include'i => {lex.createToken(lval); tok = T_INCLUDE; fbreak;};
|
||||
'include_once'i => {lex.createToken(lval); tok = T_INCLUDE_ONCE; fbreak;};
|
||||
'require'i => {lex.createToken(lval); tok = T_REQUIRE; fbreak;};
|
||||
'require_once'i => {lex.createToken(lval); tok = T_REQUIRE_ONCE; fbreak;};
|
||||
'__CLASS__'i => {lex.createToken(lval); tok = T_CLASS_C; fbreak;};
|
||||
'__DIR__'i => {lex.createToken(lval); tok = T_DIR; fbreak;};
|
||||
'__FILE__'i => {lex.createToken(lval); tok = T_FILE; fbreak;};
|
||||
'__FUNCTION__'i => {lex.createToken(lval); tok = T_FUNC_C; fbreak;};
|
||||
'__LINE__'i => {lex.createToken(lval); tok = T_LINE; fbreak;};
|
||||
'__NAMESPACE__'i => {lex.createToken(lval); tok = T_NS_C; fbreak;};
|
||||
'__METHOD__'i => {lex.createToken(lval); tok = T_METHOD_C; fbreak;};
|
||||
'__TRAIT__'i => {lex.createToken(lval); tok = T_TRAIT_C; fbreak;};
|
||||
'__halt_compiler'i => {lex.createToken(lval); tok = T_HALT_COMPILER; fnext halt_compiller_open_parenthesis; fbreak;};
|
||||
'new'i => {lex.createToken(lval); tok = T_NEW; fbreak;};
|
||||
'and'i => {lex.createToken(lval); tok = T_LOGICAL_AND; fbreak;};
|
||||
'or'i => {lex.createToken(lval); tok = T_LOGICAL_OR; fbreak;};
|
||||
'xor'i => {lex.createToken(lval); tok = T_LOGICAL_XOR; fbreak;};
|
||||
'\\' => {lex.createToken(lval); tok = T_NS_SEPARATOR; fbreak;};
|
||||
'...' => {lex.createToken(lval); tok = T_ELLIPSIS; fbreak;};
|
||||
'::' => {lex.createToken(lval); tok = T_PAAMAYIM_NEKUDOTAYIM; fbreak;};
|
||||
'&&' => {lex.createToken(lval); tok = T_BOOLEAN_AND; fbreak;};
|
||||
'||' => {lex.createToken(lval); tok = T_BOOLEAN_OR; fbreak;};
|
||||
'&=' => {lex.createToken(lval); tok = T_AND_EQUAL; fbreak;};
|
||||
'|=' => {lex.createToken(lval); tok = T_OR_EQUAL; fbreak;};
|
||||
'.=' => {lex.createToken(lval); tok = T_CONCAT_EQUAL; fbreak;};
|
||||
'*=' => {lex.createToken(lval); tok = T_MUL_EQUAL; fbreak;};
|
||||
'**=' => {lex.createToken(lval); tok = T_POW_EQUAL; fbreak;};
|
||||
'/=' => {lex.createToken(lval); tok = T_DIV_EQUAL; fbreak;};
|
||||
'+=' => {lex.createToken(lval); tok = T_PLUS_EQUAL; fbreak;};
|
||||
'-=' => {lex.createToken(lval); tok = T_MINUS_EQUAL; fbreak;};
|
||||
'^=' => {lex.createToken(lval); tok = T_XOR_EQUAL; fbreak;};
|
||||
'%=' => {lex.createToken(lval); tok = T_MOD_EQUAL; fbreak;};
|
||||
'--' => {lex.createToken(lval); tok = T_DEC; fbreak;};
|
||||
'++' => {lex.createToken(lval); tok = T_INC; fbreak;};
|
||||
'=>' => {lex.createToken(lval); tok = T_DOUBLE_ARROW; fbreak;};
|
||||
'<=>' => {lex.createToken(lval); tok = T_SPACESHIP; fbreak;};
|
||||
'!=' | '<>' => {lex.createToken(lval); tok = T_IS_NOT_EQUAL; fbreak;};
|
||||
'!==' => {lex.createToken(lval); tok = T_IS_NOT_IDENTICAL; fbreak;};
|
||||
'==' => {lex.createToken(lval); tok = T_IS_EQUAL; fbreak;};
|
||||
'===' => {lex.createToken(lval); tok = T_IS_IDENTICAL; fbreak;};
|
||||
'<<=' => {lex.createToken(lval); tok = T_SL_EQUAL; fbreak;};
|
||||
'>>=' => {lex.createToken(lval); tok = T_SR_EQUAL; fbreak;};
|
||||
'>=' => {lex.createToken(lval); tok = T_IS_GREATER_OR_EQUAL; fbreak;};
|
||||
'<=' => {lex.createToken(lval); tok = T_IS_SMALLER_OR_EQUAL; fbreak;};
|
||||
'**' => {lex.createToken(lval); tok = T_POW; fbreak;};
|
||||
'<<' => {lex.createToken(lval); tok = T_SL; fbreak;};
|
||||
'>>' => {lex.createToken(lval); tok = T_SR; fbreak;};
|
||||
'??' => {lex.createToken(lval); tok = T_COALESCE; fbreak;};
|
||||
'abstract'i => {lex.setTokenPosition(token); tok = T_ABSTRACT; fbreak;};
|
||||
'array'i => {lex.setTokenPosition(token); tok = T_ARRAY; fbreak;};
|
||||
'as'i => {lex.setTokenPosition(token); tok = T_AS; fbreak;};
|
||||
'break'i => {lex.setTokenPosition(token); tok = T_BREAK; fbreak;};
|
||||
'callable'i => {lex.setTokenPosition(token); tok = T_CALLABLE; fbreak;};
|
||||
'case'i => {lex.setTokenPosition(token); tok = T_CASE; fbreak;};
|
||||
'catch'i => {lex.setTokenPosition(token); tok = T_CATCH; fbreak;};
|
||||
'class'i => {lex.setTokenPosition(token); tok = T_CLASS; fbreak;};
|
||||
'clone'i => {lex.setTokenPosition(token); tok = T_CLONE; fbreak;};
|
||||
'const'i => {lex.setTokenPosition(token); tok = T_CONST; fbreak;};
|
||||
'continue'i => {lex.setTokenPosition(token); tok = T_CONTINUE; fbreak;};
|
||||
'declare'i => {lex.setTokenPosition(token); tok = T_DECLARE; fbreak;};
|
||||
'default'i => {lex.setTokenPosition(token); tok = T_DEFAULT; fbreak;};
|
||||
'do'i => {lex.setTokenPosition(token); tok = T_DO; fbreak;};
|
||||
'echo'i => {lex.setTokenPosition(token); tok = T_ECHO; fbreak;};
|
||||
'else'i => {lex.setTokenPosition(token); tok = T_ELSE; fbreak;};
|
||||
'elseif'i => {lex.setTokenPosition(token); tok = T_ELSEIF; fbreak;};
|
||||
'empty'i => {lex.setTokenPosition(token); tok = T_EMPTY; fbreak;};
|
||||
'enddeclare'i => {lex.setTokenPosition(token); tok = T_ENDDECLARE; fbreak;};
|
||||
'endfor'i => {lex.setTokenPosition(token); tok = T_ENDFOR; fbreak;};
|
||||
'endforeach'i => {lex.setTokenPosition(token); tok = T_ENDFOREACH; fbreak;};
|
||||
'endif'i => {lex.setTokenPosition(token); tok = T_ENDIF; fbreak;};
|
||||
'endswitch'i => {lex.setTokenPosition(token); tok = T_ENDSWITCH; fbreak;};
|
||||
'endwhile'i => {lex.setTokenPosition(token); tok = T_ENDWHILE; fbreak;};
|
||||
'eval'i => {lex.setTokenPosition(token); tok = T_EVAL; fbreak;};
|
||||
'exit'i | 'die'i => {lex.setTokenPosition(token); tok = T_EXIT; fbreak;};
|
||||
'extends'i => {lex.setTokenPosition(token); tok = T_EXTENDS; fbreak;};
|
||||
'final'i => {lex.setTokenPosition(token); tok = T_FINAL; fbreak;};
|
||||
'finally'i => {lex.setTokenPosition(token); tok = T_FINALLY; fbreak;};
|
||||
'for'i => {lex.setTokenPosition(token); tok = T_FOR; fbreak;};
|
||||
'foreach'i => {lex.setTokenPosition(token); tok = T_FOREACH; fbreak;};
|
||||
'function'i | 'cfunction'i => {lex.setTokenPosition(token); tok = T_FUNCTION; fbreak;};
|
||||
'global'i => {lex.setTokenPosition(token); tok = T_GLOBAL; fbreak;};
|
||||
'goto'i => {lex.setTokenPosition(token); tok = T_GOTO; fbreak;};
|
||||
'if'i => {lex.setTokenPosition(token); tok = T_IF; fbreak;};
|
||||
'isset'i => {lex.setTokenPosition(token); tok = T_ISSET; fbreak;};
|
||||
'implements'i => {lex.setTokenPosition(token); tok = T_IMPLEMENTS; fbreak;};
|
||||
'instanceof'i => {lex.setTokenPosition(token); tok = T_INSTANCEOF; fbreak;};
|
||||
'insteadof'i => {lex.setTokenPosition(token); tok = T_INSTEADOF; fbreak;};
|
||||
'interface'i => {lex.setTokenPosition(token); tok = T_INTERFACE; fbreak;};
|
||||
'list'i => {lex.setTokenPosition(token); tok = T_LIST; fbreak;};
|
||||
'namespace'i => {lex.setTokenPosition(token); tok = T_NAMESPACE; fbreak;};
|
||||
'private'i => {lex.setTokenPosition(token); tok = T_PRIVATE; fbreak;};
|
||||
'public'i => {lex.setTokenPosition(token); tok = T_PUBLIC; fbreak;};
|
||||
'print'i => {lex.setTokenPosition(token); tok = T_PRINT; fbreak;};
|
||||
'protected'i => {lex.setTokenPosition(token); tok = T_PROTECTED; fbreak;};
|
||||
'return'i => {lex.setTokenPosition(token); tok = T_RETURN; fbreak;};
|
||||
'static'i => {lex.setTokenPosition(token); tok = T_STATIC; fbreak;};
|
||||
'switch'i => {lex.setTokenPosition(token); tok = T_SWITCH; fbreak;};
|
||||
'throw'i => {lex.setTokenPosition(token); tok = T_THROW; fbreak;};
|
||||
'trait'i => {lex.setTokenPosition(token); tok = T_TRAIT; fbreak;};
|
||||
'try'i => {lex.setTokenPosition(token); tok = T_TRY; fbreak;};
|
||||
'unset'i => {lex.setTokenPosition(token); tok = T_UNSET; fbreak;};
|
||||
'use'i => {lex.setTokenPosition(token); tok = T_USE; fbreak;};
|
||||
'var'i => {lex.setTokenPosition(token); tok = T_VAR; fbreak;};
|
||||
'while'i => {lex.setTokenPosition(token); tok = T_WHILE; fbreak;};
|
||||
'yield'i whitespace_line* 'from'i => {lex.setTokenPosition(token); tok = T_YIELD_FROM; fbreak;};
|
||||
'yield'i => {lex.setTokenPosition(token); tok = T_YIELD; fbreak;};
|
||||
'include'i => {lex.setTokenPosition(token); tok = T_INCLUDE; fbreak;};
|
||||
'include_once'i => {lex.setTokenPosition(token); tok = T_INCLUDE_ONCE; fbreak;};
|
||||
'require'i => {lex.setTokenPosition(token); tok = T_REQUIRE; fbreak;};
|
||||
'require_once'i => {lex.setTokenPosition(token); tok = T_REQUIRE_ONCE; fbreak;};
|
||||
'__CLASS__'i => {lex.setTokenPosition(token); tok = T_CLASS_C; fbreak;};
|
||||
'__DIR__'i => {lex.setTokenPosition(token); tok = T_DIR; fbreak;};
|
||||
'__FILE__'i => {lex.setTokenPosition(token); tok = T_FILE; fbreak;};
|
||||
'__FUNCTION__'i => {lex.setTokenPosition(token); tok = T_FUNC_C; fbreak;};
|
||||
'__LINE__'i => {lex.setTokenPosition(token); tok = T_LINE; fbreak;};
|
||||
'__NAMESPACE__'i => {lex.setTokenPosition(token); tok = T_NS_C; fbreak;};
|
||||
'__METHOD__'i => {lex.setTokenPosition(token); tok = T_METHOD_C; fbreak;};
|
||||
'__TRAIT__'i => {lex.setTokenPosition(token); tok = T_TRAIT_C; fbreak;};
|
||||
'__halt_compiler'i => {lex.setTokenPosition(token); tok = T_HALT_COMPILER; fnext halt_compiller_open_parenthesis; fbreak;};
|
||||
'new'i => {lex.setTokenPosition(token); tok = T_NEW; fbreak;};
|
||||
'and'i => {lex.setTokenPosition(token); tok = T_LOGICAL_AND; fbreak;};
|
||||
'or'i => {lex.setTokenPosition(token); tok = T_LOGICAL_OR; fbreak;};
|
||||
'xor'i => {lex.setTokenPosition(token); tok = T_LOGICAL_XOR; fbreak;};
|
||||
'\\' => {lex.setTokenPosition(token); tok = T_NS_SEPARATOR; fbreak;};
|
||||
'...' => {lex.setTokenPosition(token); tok = T_ELLIPSIS; fbreak;};
|
||||
'::' => {lex.setTokenPosition(token); tok = T_PAAMAYIM_NEKUDOTAYIM; fbreak;};
|
||||
'&&' => {lex.setTokenPosition(token); tok = T_BOOLEAN_AND; fbreak;};
|
||||
'||' => {lex.setTokenPosition(token); tok = T_BOOLEAN_OR; fbreak;};
|
||||
'&=' => {lex.setTokenPosition(token); tok = T_AND_EQUAL; fbreak;};
|
||||
'|=' => {lex.setTokenPosition(token); tok = T_OR_EQUAL; fbreak;};
|
||||
'.=' => {lex.setTokenPosition(token); tok = T_CONCAT_EQUAL; fbreak;};
|
||||
'*=' => {lex.setTokenPosition(token); tok = T_MUL_EQUAL; fbreak;};
|
||||
'**=' => {lex.setTokenPosition(token); tok = T_POW_EQUAL; fbreak;};
|
||||
'/=' => {lex.setTokenPosition(token); tok = T_DIV_EQUAL; fbreak;};
|
||||
'+=' => {lex.setTokenPosition(token); tok = T_PLUS_EQUAL; fbreak;};
|
||||
'-=' => {lex.setTokenPosition(token); tok = T_MINUS_EQUAL; fbreak;};
|
||||
'^=' => {lex.setTokenPosition(token); tok = T_XOR_EQUAL; fbreak;};
|
||||
'%=' => {lex.setTokenPosition(token); tok = T_MOD_EQUAL; fbreak;};
|
||||
'--' => {lex.setTokenPosition(token); tok = T_DEC; fbreak;};
|
||||
'++' => {lex.setTokenPosition(token); tok = T_INC; fbreak;};
|
||||
'=>' => {lex.setTokenPosition(token); tok = T_DOUBLE_ARROW; fbreak;};
|
||||
'<=>' => {lex.setTokenPosition(token); tok = T_SPACESHIP; fbreak;};
|
||||
'!=' | '<>' => {lex.setTokenPosition(token); tok = T_IS_NOT_EQUAL; fbreak;};
|
||||
'!==' => {lex.setTokenPosition(token); tok = T_IS_NOT_IDENTICAL; fbreak;};
|
||||
'==' => {lex.setTokenPosition(token); tok = T_IS_EQUAL; fbreak;};
|
||||
'===' => {lex.setTokenPosition(token); tok = T_IS_IDENTICAL; fbreak;};
|
||||
'<<=' => {lex.setTokenPosition(token); tok = T_SL_EQUAL; fbreak;};
|
||||
'>>=' => {lex.setTokenPosition(token); tok = T_SR_EQUAL; fbreak;};
|
||||
'>=' => {lex.setTokenPosition(token); tok = T_IS_GREATER_OR_EQUAL; fbreak;};
|
||||
'<=' => {lex.setTokenPosition(token); tok = T_IS_SMALLER_OR_EQUAL; fbreak;};
|
||||
'**' => {lex.setTokenPosition(token); tok = T_POW; fbreak;};
|
||||
'<<' => {lex.setTokenPosition(token); tok = T_SL; fbreak;};
|
||||
'>>' => {lex.setTokenPosition(token); tok = T_SR; fbreak;};
|
||||
'??' => {lex.setTokenPosition(token); tok = T_COALESCE; fbreak;};
|
||||
|
||||
'(' whitespace* 'array'i whitespace* ')' => {lex.createToken(lval); tok = T_ARRAY_CAST; fbreak;};
|
||||
'(' whitespace* ('bool'i|'boolean'i) whitespace* ')' => {lex.createToken(lval); tok = T_BOOL_CAST; fbreak;};
|
||||
'(' whitespace* ('real'i|'double'i|'float'i) whitespace* ')' => {lex.createToken(lval); tok = T_DOUBLE_CAST; fbreak;};
|
||||
'(' whitespace* ('int'i|'integer'i) whitespace* ')' => {lex.createToken(lval); tok = T_INT_CAST; fbreak;};
|
||||
'(' whitespace* 'object'i whitespace* ')' => {lex.createToken(lval); tok = T_OBJECT_CAST; fbreak;};
|
||||
'(' whitespace* ('string'i|'binary'i) whitespace* ')' => {lex.createToken(lval); tok = T_STRING_CAST; fbreak;};
|
||||
'(' whitespace* 'unset'i whitespace* ')' => {lex.createToken(lval); tok = T_UNSET_CAST; fbreak;};
|
||||
'(' whitespace* 'array'i whitespace* ')' => {lex.setTokenPosition(token); tok = T_ARRAY_CAST; fbreak;};
|
||||
'(' whitespace* ('bool'i|'boolean'i) whitespace* ')' => {lex.setTokenPosition(token); tok = T_BOOL_CAST; fbreak;};
|
||||
'(' whitespace* ('real'i|'double'i|'float'i) whitespace* ')' => {lex.setTokenPosition(token); tok = T_DOUBLE_CAST; fbreak;};
|
||||
'(' whitespace* ('int'i|'integer'i) whitespace* ')' => {lex.setTokenPosition(token); tok = T_INT_CAST; fbreak;};
|
||||
'(' whitespace* 'object'i whitespace* ')' => {lex.setTokenPosition(token); tok = T_OBJECT_CAST; fbreak;};
|
||||
'(' whitespace* ('string'i|'binary'i) whitespace* ')' => {lex.setTokenPosition(token); tok = T_STRING_CAST; fbreak;};
|
||||
'(' whitespace* 'unset'i whitespace* ')' => {lex.setTokenPosition(token); tok = T_UNSET_CAST; fbreak;};
|
||||
|
||||
('#' | '//') any_line* when is_not_comment_end => {
|
||||
lex.ungetStr("?>")
|
||||
@ -325,27 +329,27 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
operators => {
|
||||
// rune, _ := utf8.DecodeRune(lex.data[lex.ts:lex.te]);
|
||||
// tok = TokenID(Rune2Class(rune));
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = TokenID(int(lex.data[lex.ts]));
|
||||
fbreak;
|
||||
};
|
||||
|
||||
"{" => { lex.createToken(lval); tok = TokenID(int('{')); lex.call(ftargs, fentry(php)); goto _out; };
|
||||
"}" => { lex.createToken(lval); tok = TokenID(int('}')); lex.ret(1); lex.PhpDocComment = ""; goto _out;};
|
||||
"$" varname => { lex.createToken(lval); tok = T_VARIABLE; fbreak; };
|
||||
varname => { lex.createToken(lval); tok = T_STRING; fbreak; };
|
||||
"{" => { lex.setTokenPosition(token); tok = TokenID(int('{')); lex.call(ftargs, fentry(php)); goto _out; };
|
||||
"}" => { lex.setTokenPosition(token); tok = TokenID(int('}')); lex.ret(1); lex.PhpDocComment = ""; goto _out;};
|
||||
"$" varname => { lex.setTokenPosition(token); tok = T_VARIABLE; fbreak; };
|
||||
varname => { lex.setTokenPosition(token); tok = T_STRING; fbreak; };
|
||||
|
||||
"->" => { lex.createToken(lval); tok = T_OBJECT_OPERATOR; fnext property; fbreak; };
|
||||
"->" => { lex.setTokenPosition(token); tok = T_OBJECT_OPERATOR; fnext property; fbreak; };
|
||||
|
||||
constant_string => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_CONSTANT_ENCAPSED_STRING;
|
||||
fbreak;
|
||||
};
|
||||
|
||||
"b"i? "<<<" [ \t]* ( heredoc_label | ("'" heredoc_label "'") | ('"' heredoc_label '"') ) newline => {
|
||||
lex.heredocLabel = lex.data[lblStart:lblEnd]
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_START_HEREDOC;
|
||||
|
||||
if lex.isHeredocEnd(lex.p+1) {
|
||||
@ -357,8 +361,8 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
}
|
||||
fbreak;
|
||||
};
|
||||
"`" => {lex.createToken(lval); tok = TokenID(int('`')); fnext backqote; fbreak;};
|
||||
'"' => {lex.createToken(lval); tok = TokenID(int('"')); fnext template_string; fbreak;};
|
||||
"`" => {lex.setTokenPosition(token); tok = TokenID(int('`')); fnext backqote; fbreak;};
|
||||
'"' => {lex.setTokenPosition(token); tok = TokenID(int('"')); fnext template_string; fbreak;};
|
||||
|
||||
any_line => {
|
||||
c := lex.data[lex.p]
|
||||
@ -368,14 +372,14 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
|
||||
property := |*
|
||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||
"->" => {lex.createToken(lval); tok = T_OBJECT_OPERATOR; fbreak;};
|
||||
varname => {lex.createToken(lval); tok = T_STRING; fnext php; fbreak;};
|
||||
"->" => {lex.setTokenPosition(token); tok = T_OBJECT_OPERATOR; fbreak;};
|
||||
varname => {lex.setTokenPosition(token); tok = T_STRING; fnext php; fbreak;};
|
||||
any => {lex.ungetCnt(1); fgoto php;};
|
||||
*|;
|
||||
|
||||
nowdoc := |*
|
||||
any_line* when is_not_heredoc_end => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_ENCAPSED_AND_WHITESPACE;
|
||||
fnext heredoc_end;
|
||||
fbreak;
|
||||
@ -383,11 +387,11 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
*|;
|
||||
|
||||
heredoc := |*
|
||||
"{$" => {lex.ungetCnt(1); lex.createToken(lval); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;};
|
||||
"${" => {lex.createToken(lval); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;};
|
||||
"{$" => {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;};
|
||||
any_line* when is_not_heredoc_end_or_var => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_ENCAPSED_AND_WHITESPACE;
|
||||
|
||||
if lex.data[lex.p+1] != '$' && lex.data[lex.p+1] != '{' {
|
||||
@ -398,24 +402,24 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
*|;
|
||||
|
||||
backqote := |*
|
||||
"{$" => {lex.ungetCnt(1); lex.createToken(lval); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;};
|
||||
"${" => {lex.createToken(lval); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;};
|
||||
"{$" => {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.createToken(lval); tok = TokenID(int('`')); fnext php; fbreak;};
|
||||
'`' => {lex.setTokenPosition(token); tok = TokenID(int('`')); fnext php; fbreak;};
|
||||
any_line* when is_not_backqoute_end_or_var => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_ENCAPSED_AND_WHITESPACE;
|
||||
fbreak;
|
||||
};
|
||||
*|;
|
||||
|
||||
template_string := |*
|
||||
"{$" => {lex.ungetCnt(1); lex.createToken(lval); tok = T_CURLY_OPEN; lex.call(ftargs, fentry(php)); goto _out;};
|
||||
"${" => {lex.createToken(lval); tok = T_DOLLAR_OPEN_CURLY_BRACES; lex.call(ftargs, fentry(string_var_name)); goto _out;};
|
||||
"{$" => {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.createToken(lval); tok = TokenID(int('"')); fnext php; fbreak;};
|
||||
'"' => {lex.setTokenPosition(token); tok = TokenID(int('"')); fnext php; fbreak;};
|
||||
any_line* when is_not_string_end_or_var => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_ENCAPSED_AND_WHITESPACE;
|
||||
fbreak;
|
||||
};
|
||||
@ -423,13 +427,13 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
|
||||
heredoc_end := |*
|
||||
varname -- ";" => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_END_HEREDOC;
|
||||
fnext php;
|
||||
fbreak;
|
||||
};
|
||||
varname => {
|
||||
lex.createToken(lval);
|
||||
lex.setTokenPosition(token);
|
||||
tok = T_END_HEREDOC;
|
||||
fnext php;
|
||||
fbreak;
|
||||
@ -437,20 +441,20 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
*|;
|
||||
|
||||
string_var := |*
|
||||
'$' varname => {lex.createToken(lval); tok = T_VARIABLE; fbreak;};
|
||||
'->' varname_first => {lex.ungetCnt(1); lex.createToken(lval); tok = T_OBJECT_OPERATOR; fbreak;};
|
||||
varname => {lex.createToken(lval); tok = T_STRING; fbreak;};
|
||||
'[' => {lex.createToken(lval); tok = TokenID(int('[')); lex.call(ftargs, fentry(string_var_index)); goto _out;};
|
||||
'$' varname => {lex.setTokenPosition(token); tok = T_VARIABLE; fbreak;};
|
||||
'->' varname_first => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_OBJECT_OPERATOR; fbreak;};
|
||||
varname => {lex.setTokenPosition(token); tok = T_STRING; fbreak;};
|
||||
'[' => {lex.setTokenPosition(token); tok = TokenID(int('[')); lex.call(ftargs, fentry(string_var_index)); goto _out;};
|
||||
any => {lex.ungetCnt(1); fret;};
|
||||
*|;
|
||||
|
||||
string_var_index := |*
|
||||
lnum | hnum | bnum => {lex.createToken(lval); tok = T_NUM_STRING; fbreak;};
|
||||
'$' varname => {lex.createToken(lval); tok = T_VARIABLE; fbreak;};
|
||||
varname => {lex.createToken(lval); tok = T_STRING; fbreak;};
|
||||
whitespace_line | [\\'#] => {lex.createToken(lval); tok = T_ENCAPSED_AND_WHITESPACE; lex.ret(2); goto _out;};
|
||||
operators > (svi, 1) => {lex.createToken(lval); tok = TokenID(int(lex.data[lex.ts])); fbreak;};
|
||||
']' > (svi, 2) => {lex.createToken(lval); tok = TokenID(int(']')); lex.ret(2); goto _out;};
|
||||
lnum | hnum | bnum => {lex.setTokenPosition(token); tok = T_NUM_STRING; fbreak;};
|
||||
'$' varname => {lex.setTokenPosition(token); tok = T_VARIABLE; fbreak;};
|
||||
varname => {lex.setTokenPosition(token); tok = T_STRING; fbreak;};
|
||||
whitespace_line | [\\'#] => {lex.setTokenPosition(token); tok = T_ENCAPSED_AND_WHITESPACE; lex.ret(2); goto _out;};
|
||||
operators > (svi, 1) => {lex.setTokenPosition(token); tok = TokenID(int(lex.data[lex.ts])); fbreak;};
|
||||
']' > (svi, 2) => {lex.setTokenPosition(token); tok = TokenID(int(']')); lex.ret(2); goto _out;};
|
||||
any_line => {
|
||||
c := lex.data[lex.p]
|
||||
lex.Error(fmt.Sprintf("WARNING: Unexpected character in input: '%c' (ASCII=%d)", c, c));
|
||||
@ -458,25 +462,25 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
*|;
|
||||
|
||||
string_var_name := |*
|
||||
varname ("[" | "}") => {lex.ungetCnt(1); lex.createToken(lval); tok = T_STRING_VARNAME; fnext php; fbreak;};
|
||||
varname ("[" | "}") => {lex.ungetCnt(1); lex.setTokenPosition(token); tok = T_STRING_VARNAME; fnext php; fbreak;};
|
||||
any => {lex.ungetCnt(1); fnext php;};
|
||||
*|;
|
||||
|
||||
halt_compiller_open_parenthesis := |*
|
||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||
"(" => {lex.createToken(lval); tok = TokenID(int('(')); fnext halt_compiller_close_parenthesis; fbreak;};
|
||||
"(" => {lex.setTokenPosition(token); tok = TokenID(int('(')); fnext halt_compiller_close_parenthesis; fbreak;};
|
||||
any => {lex.ungetCnt(1); fnext php;};
|
||||
*|;
|
||||
|
||||
halt_compiller_close_parenthesis := |*
|
||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||
")" => {lex.createToken(lval); tok = TokenID(int(')')); fnext halt_compiller_close_semicolon; fbreak;};
|
||||
")" => {lex.setTokenPosition(token); tok = TokenID(int(')')); fnext halt_compiller_close_semicolon; fbreak;};
|
||||
any => {lex.ungetCnt(1); fnext php;};
|
||||
*|;
|
||||
|
||||
halt_compiller_close_semicolon := |*
|
||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||
";" => {lex.createToken(lval); tok = TokenID(int(';')); fnext halt_compiller_end; fbreak;};
|
||||
";" => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext halt_compiller_end; fbreak;};
|
||||
any => {lex.ungetCnt(1); fnext php;};
|
||||
*|;
|
||||
|
||||
@ -487,14 +491,10 @@ func (lex *Lexer) Lex(lval Lval) int {
|
||||
write exec;
|
||||
}%%
|
||||
|
||||
// always return same $end token
|
||||
if tok == 0 {
|
||||
if lex.lastToken == nil {
|
||||
lex.ts, lex.te = 0, 0
|
||||
lex.lastToken = lex.createToken(lval)
|
||||
}
|
||||
lval.Token(lex.lastToken);
|
||||
}
|
||||
token.FreeFloating = lex.FreeFloating
|
||||
token.Value = string(lex.data[lex.ts:lex.te])
|
||||
|
||||
lval.Token(token)
|
||||
|
||||
return int(tok);
|
||||
}
|
Loading…
Reference in New Issue
Block a user