From e11233dc492a96844d22e4a3ed8e9e2d8a36651c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 20 May 2019 06:06:38 +0200 Subject: Revert "Rename *.l files to *.re" This reverts commit 969047749d33bb88a0573aa91a57e2070335111a. --- sapi/phpdbg/phpdbg_lexer.l | 214 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 sapi/phpdbg/phpdbg_lexer.l (limited to 'sapi/phpdbg/phpdbg_lexer.l') diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l new file mode 100644 index 0000000000..422cda4f2c --- /dev/null +++ b/sapi/phpdbg/phpdbg_lexer.l @@ -0,0 +1,214 @@ +/* + * phpdbg_lexer.l + */ + +#include "phpdbg.h" +#include "phpdbg_cmd.h" + +#include "phpdbg_parser.h" + +#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 YYCTXMARKER LEX(ctxmarker) +#define yyleng LEX(len) +#define yytext ((char*) LEX(text)) +#undef YYDEBUG +#define YYDEBUG(a, b) +#define YYFILL(n) + +#define NORMAL 0 +#define PRE_RAW 1 +#define RAW 2 +#define INITIAL 3 + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg) + +void phpdbg_init_lexer (phpdbg_param_t *stack, char *input) { + PHPDBG_G(parser_stack) = stack; + + YYSETCONDITION(INITIAL); + + LEX(text) = YYCURSOR = (unsigned char *) input; + LEX(len) = strlen(input); +} + +static int unescape_string(char *s) { + switch (*s) { + case '\'': + case '\"': { + char start = *s; + size_t off = 1; + do { + if (s[off] == '\\') { + off++; + } + *s = s[off]; + } while ((++s)[off] != start); + return off + 1; + } + } + + return 0; +} + +int phpdbg_lex (phpdbg_param_t* yylval) { + +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\t]+ +DIGITS [-]?[0-9\.]+ +ID [^ \r\n\t:#\000]+ +GENERIC_ID ([^ \r\n\t:#\000"']|":\\")+|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+['] +ADDR [0][x][a-fA-F0-9]+ +OPCODE (ZEND_|zend_)([A-Za-z])+ +INPUT ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])+["]|[']("\\"[']|"\\\\"|[^\n\000'])+[']|[^\n\000#"'])+ + + := yyleng = (size_t) YYCURSOR - (size_t) yytext; + +<*>[\n\000] { + return 0; +} + +"-r"{WS}?{DIGITS} { + char *text = yytext + 2; + while (*++text < '0'); + yylval->num = atoi(text); + return T_REQ_ID; +} + +{T_IF}{WS} { + YYSETCONDITION(RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return T_IF; +} + +"#"/{DIGITS} { + return T_POUND; +} + +<*>"#" { + YYSETCONDITION(INITIAL); + return T_SEPARATOR; +} + +"::" { + return T_DCOLON; +} + +":"/[^\\] { + return T_COLON; +} + +{ID}"://" { + phpdbg_init_param(yylval, STR_PARAM); + yylval->str = estrndup(yytext, yyleng); + yylval->len = yyleng; + return T_PROTO; +} + +({T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE})/[ \r\t\n\000] { + phpdbg_init_param(yylval, NUMERIC_PARAM); + yylval->num = 1; + return T_TRUTHY; +} + +({T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE})/[ \r\t\n\000] { + 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 = estrndup(yytext, yyleng); + yylval->len = yyleng; + return T_OPCODE; +} + +{GENERIC_ID} { + phpdbg_init_param(yylval, STR_PARAM); + yylval->str = estrndup(yytext, yyleng - unescape_string(yytext)); + yylval->len = yyleng; + return T_ID; +} + +{INPUT} { + phpdbg_init_param(yylval, STR_PARAM); + yylval->str = estrdup(yytext); + yylval->len = yyleng; + return T_INPUT; +} + +<*>{WS} { + /* ignore whitespace */ + + goto restart; +} + +{T_EVAL}{WS} { + YYSETCONDITION(PRE_RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return T_EVAL; +} + +{T_SHELL}{WS} { + YYSETCONDITION(PRE_RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return T_SHELL; +} + +({T_RUN}|{T_RUN_SHORT}){WS} { + YYSETCONDITION(PRE_RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return T_RUN; +} + +[^ ] { + YYSETCONDITION(RAW); + + YYCURSOR = LEX(text); + goto restart; +} + +[^ ] { + YYSETCONDITION(NORMAL); + + YYCURSOR = LEX(text); + goto restart; +} + +*/ +} -- cgit v1.2.1