diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg_lexer.l')
| -rw-r--r-- | sapi/phpdbg/phpdbg_lexer.l | 270 | 
1 files changed, 154 insertions, 116 deletions
diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l index b3536feab8..4d9c837f1e 100644 --- a/sapi/phpdbg/phpdbg_lexer.l +++ b/sapi/phpdbg/phpdbg_lexer.l @@ -1,131 +1,169 @@ -%{ -   /*   * phpdbg_lexer.l   */  #include "phpdbg.h"  #include "phpdbg_cmd.h" -#define YYSTYPE phpdbg_param_t  #include "phpdbg_parser.h" -%} - -%s RAW  -%s NORMAL - -%option outfile="sapi/phpdbg/phpdbg_lexer.c" header-file="sapi/phpdbg/phpdbg_lexer.h" -%option warn nodefault -  -%option reentrant noyywrap never-interactive nounistd -%option bison-bridge - -T_TRUE				"true" -T_YES				"yes" -T_ON				"on" -T_ENABLED			"enabled" -T_FALSE				"false" -T_NO				"no" -T_OFF				"off" -T_DISABLED			"disabled" -T_EVAL				"ev" -T_SHELL				"sh" -T_IF				"if" -T_RUN				"run" -T_RUN_SHORT			"r" - -WS          		[ \r\n\t]+ -DIGITS				[0-9\.]+ -ID					[^ \r\n\t:#]+ -ADDR				0x[a-fA-F0-9]+ -OPCODE				(ZEND_|zend_)([A-Za-z])+ -INPUT				[^\n]+ -%% - -<INITIAL>{ -	{T_EVAL}		{ -		BEGIN(RAW); -		phpdbg_init_param(yylval, EMPTY_PARAM); -		return T_EVAL; -	} -	{T_SHELL}		{ -		BEGIN(RAW); -		phpdbg_init_param(yylval, EMPTY_PARAM); -		return T_SHELL; -	} -	{T_RUN}|{T_RUN_SHORT}	{ -		BEGIN(RAW); -		phpdbg_init_param(yylval, EMPTY_PARAM); -		return T_RUN; -	} - -	.+	{ -		BEGIN(NORMAL); -		REJECT; -	} -} - -<NORMAL>{ -	{T_IF}			{ -		BEGIN(RAW); -		phpdbg_init_param(yylval, EMPTY_PARAM); -		return T_IF; -	} -} - -<INITIAL,NORMAL>{ -	{ID}[:]{1}[//]{2}	{ -		phpdbg_init_param(yylval, STR_PARAM); -		yylval->str = zend_strndup(yytext, yyleng); -		yylval->len = yyleng; -		return T_PROTO; -	} -	[#]{1}			{ return T_POUND;  } -	[:]{2}			{ return T_DCOLON; } -	[:]{1}			{ return T_COLON;  } - -	{T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE} 	{ -		phpdbg_init_param(yylval, NUMERIC_PARAM); -		yylval->num = 1;		 -		return T_TRUTHY; -	} -	{T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE} { -		phpdbg_init_param(yylval, NUMERIC_PARAM); -		yylval->num = 0; -		return T_FALSY; -	} -	{DIGITS}         { -		phpdbg_init_param(yylval, NUMERIC_PARAM); -		yylval->num = atoi(yytext); -		return T_DIGITS; -	} -	{ADDR}		{ -		phpdbg_init_param(yylval, ADDR_PARAM); -		yylval->addr = strtoul(yytext, 0, 16); -		return T_ADDR; -	} -	{OPCODE}	{ -		phpdbg_init_param(yylval, OP_PARAM); -		yylval->str = zend_strndup(yytext, yyleng); -		yylval->len = yyleng; -		return T_OPCODE; -	} -	{ID}			{ -		phpdbg_init_param(yylval, STR_PARAM); -		yylval->str = zend_strndup(yytext, yyleng); -		yylval->len = yyleng; -		return T_ID;  -	} -} - -<RAW>{INPUT}		{ +#define LEX(v) (PHPDBG_G(lexer).v) + +#define YYCTYPE unsigned char +#define YYSETCONDITION(x) LEX(state) = x; +#define YYGETCONDITION() LEX(state) +#define YYCURSOR LEX(cursor) +#define YYMARKER LEX(marker) +#define yyleng LEX(len) +#define yytext ((char*) LEX(text)) +#undef YYDEBUG +#define YYDEBUG(a, b) +#define YYFILL(n) + +#define NORMAL 0 +#define RAW 1 +#define INITIAL 2 + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +void phpdbg_init_lexer (phpdbg_param_t *stack, char *input TSRMLS_DC) { +	PHPDBG_G(parser_stack) = stack; + +	YYSETCONDITION(INITIAL); + +	LEX(text) = YYCURSOR = (unsigned char *) input; +	LEX(len) = strlen(input); +} + +int phpdbg_lex (phpdbg_param_t* yylval) { +	TSRMLS_FETCH(); /* Slow, but this is not a major problem here. TODO: Use TSRMLS_DC */ + +restart: +	LEX(text) = YYCURSOR; + +/*!re2c +re2c:yyfill:check = 0; +T_TRUE      "true" +T_YES       "yes" +T_ON        "on" +T_ENABLED   "enabled" +T_FALSE     "false" +T_NO        "no" +T_OFF       "off" +T_DISABLED  "disabled" +T_EVAL      "ev" +T_SHELL     "sh" +T_IF        "if" +T_RUN       "run" +T_RUN_SHORT "r" +WS          [ \r\n\t]+ +DIGITS      [0-9\.]+ +ID          [^ \r\n\t:#\000]+ +ADDR        [0][x][a-fA-F0-9]+ +OPCODE      (ZEND_|zend_)([A-Za-z])+ +INPUT       [^\n\000]+ + +<!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext; + +<*>[\n\000] { +	return 0; +} + +<NORMAL>{T_IF} { +	YYSETCONDITION(RAW); +	phpdbg_init_param(yylval, EMPTY_PARAM); +	return T_IF; +} + +<NORMAL>{ID}[:]{1}[//]{2} { +	phpdbg_init_param(yylval, STR_PARAM); +	yylval->str = zend_strndup(yytext, yyleng); +	yylval->len = yyleng; +	return T_PROTO; +} +<NORMAL>[#]{1} { +	return T_POUND; +} +<NORMAL>[:]{2} { +	return T_DCOLON; +} +<NORMAL>[:]{1} { +	return T_COLON; +} + +<NORMAL>{T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE} { +	phpdbg_init_param(yylval, NUMERIC_PARAM); +	yylval->num = 1;		 +	return T_TRUTHY; +} + +<NORMAL>{T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE} { +	phpdbg_init_param(yylval, NUMERIC_PARAM); +	yylval->num = 0; +	return T_FALSY; +} + +<NORMAL>{DIGITS} { +	phpdbg_init_param(yylval, NUMERIC_PARAM); +	yylval->num = atoi(yytext); +	return T_DIGITS; +} + +<NORMAL>{ADDR} { +	phpdbg_init_param(yylval, ADDR_PARAM); +	yylval->addr = strtoul(yytext, 0, 16); +	return T_ADDR; +} + +<NORMAL>{OPCODE} { +	phpdbg_init_param(yylval, OP_PARAM); +	yylval->str = zend_strndup(yytext, yyleng); +	yylval->len = yyleng; +	return T_OPCODE; +} + +<NORMAL>{ID} { +	phpdbg_init_param(yylval, STR_PARAM); +	yylval->str = zend_strndup(yytext, yyleng); +	yylval->len = yyleng; +	return T_ID;  +} + +<RAW>{INPUT} {  	phpdbg_init_param(yylval, STR_PARAM);  	yylval->str = zend_strndup(yytext, yyleng);  	yylval->len = yyleng; -	BEGIN(INITIAL);  	return T_INPUT;  } -{WS}        		{ /* ignore whitespace */ } -%% +<*>{WS} { +	/* ignore whitespace */ + +	goto restart; +} + +<INITIAL>{T_EVAL} { +	YYSETCONDITION(RAW); +	phpdbg_init_param(yylval, EMPTY_PARAM); +	return T_EVAL; +} +<INITIAL>{T_SHELL} { +	YYSETCONDITION(RAW); +	phpdbg_init_param(yylval, EMPTY_PARAM); +	return T_SHELL; +} +<INITIAL>{T_RUN}|{T_RUN_SHORT} { +	YYSETCONDITION(RAW); +	phpdbg_init_param(yylval, EMPTY_PARAM); +	return T_RUN; +} + +<INITIAL>. { +	YYSETCONDITION(NORMAL); + +	YYCURSOR = LEX(text); +	goto restart; +} + +*/ +}  | 
