From a01853de7890a3058a79666d1359b63b729d586a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 15 Feb 2014 19:51:39 +0000 Subject: [PATCH] betterness --- phpdbg_lexer.l | 105 +++++++++++++++++++++++++++++------------------- phpdbg_parser.y | 17 +++++--- 2 files changed, 74 insertions(+), 48 deletions(-) diff --git a/phpdbg_lexer.l b/phpdbg_lexer.l index eb93d130f0..73998c3d99 100644 --- a/phpdbg_lexer.l +++ b/phpdbg_lexer.l @@ -13,6 +13,8 @@ #include %} +%s RAW + %option outfile="phpdbg_lexer.c" header-file="phpdbg_lexer.h" %option warn nodefault @@ -27,6 +29,8 @@ C_FALSE "false" C_NO "no" C_OFF "off" C_DISABLED "disabled" +C_EVAL "eval" +C_SHELL "shell" DIGITS [0-9]+ ID [a-zA-Z][a-zA-Z0-9_]+ @@ -35,53 +39,70 @@ FILE [^ :0-9]{1,}:[0-9]+ OPLINE 0x[a-fA-F0-9]+ LITERAL \"(\\.|[^\\"])*\" WS [ \r\n\t]+ +INPUT [^\n]+ %% - -{WS} { } -{C_YES}|{C_ON}|{C_ENABLED}|{C_TRUE} { - yylval->type = NUMERIC_PARAM; - yylval->num = 1; - return C_TRUTHY; -} -{C_NO}|{C_OFF}|{C_DISABLED}|{C_FALSE} { - yylval->type = NUMERIC_PARAM; - yylval->num = 0; - return C_FALSY; -} -{DIGITS} { - yylval->type = NUMERIC_PARAM; - yylval->num = atoi(yytext); - return T_DIGITS; -} -{METHOD} { - yylval->type = METHOD_PARAM; - yylval->method.class = "class"; - yylval->method.name = "func"; - return T_METHOD; -} -{FILE} { - yylval->type = FILE_PARAM; - yylval->file.name = strndup(yytext, yyleng); - yylval->file.line = 0; - return T_FILE; -} -{OPLINE} { - yylval->type = ADDR_PARAM; - yylval->addr = strtoul(yytext, NULL, 10); - return T_OPLINE; -} -{LITERAL} { - yylval->type = STR_PARAM; - yylval->str = strndup(yytext, yyleng); - yylval->len = yyleng; - return T_LITERAL; +{WS} { } + +{ + {C_YES}|{C_ON}|{C_ENABLED}|{C_TRUE} { + yylval->type = NUMERIC_PARAM; + yylval->num = 1; + return C_TRUTHY; + } + {C_NO}|{C_OFF}|{C_DISABLED}|{C_FALSE} { + yylval->type = NUMERIC_PARAM; + yylval->num = 0; + return C_FALSY; + } + {C_EVAL} { + BEGIN(RAW); + return C_EVAL; + } + {C_SHELL} { + BEGIN(RAW); + return C_SHELL; + } + {DIGITS} { + yylval->type = NUMERIC_PARAM; + yylval->num = atoi(yytext); + return T_DIGITS; + } + {METHOD} { + yylval->type = METHOD_PARAM; + yylval->method.class = "class"; + yylval->method.name = "func"; + return T_METHOD; + } + {FILE} { + yylval->type = FILE_PARAM; + yylval->file.name = strndup(yytext, yyleng); + yylval->file.line = 0; + return T_FILE; + } + {OPLINE} { + yylval->type = ADDR_PARAM; + yylval->addr = strtoul(yytext, NULL, 10); + return T_OPLINE; + } + {LITERAL} { + yylval->type = STR_PARAM; + yylval->str = strndup(yytext, yyleng); + yylval->len = yyleng; + return T_LITERAL; + } + {ID} { + yylval->type = STR_PARAM; + yylval->str = strndup(yytext, yyleng); + yylval->len = yyleng; + return T_ID; + } } -[a-zA-Z]+ { +{INPUT} { yylval->type = STR_PARAM; yylval->str = strndup(yytext, yyleng); yylval->len = yyleng; - - return C_CMD; + BEGIN(INITIAL); + return T_INPUT; } . { /** command detection here **/ diff --git a/phpdbg_parser.y b/phpdbg_parser.y index ef3dca58bb..fa53e7956f 100644 --- a/phpdbg_parser.y +++ b/phpdbg_parser.y @@ -82,7 +82,7 @@ int main(int argc, char **argv) { typedef void* yyscan_t; #endif } - +%expect 1 %output "phpdbg_parser.c" %defines "phpdbg_parser.h" @@ -91,11 +91,11 @@ typedef void* yyscan_t; %parse-param { phpdbg_param_t **expression } %parse-param { yyscan_t scanner } -%token C_CMD "command (possibly automatically detected)" - %token C_TRUTHY "truthy (true, on, yes or enabled)" %token C_FALSY "falsy (false, off, no or disabled)" %token C_STRING "string (some input, perhaps)" +%token C_EVAL "eval" +%token C_SHELL "shell" %token T_DIGITS "digits (numbers)" %token T_LITERAL "literal (T_LITERAL)" @@ -103,7 +103,7 @@ typedef void* yyscan_t; %token T_OPLINE "opline (T_OPLINE)" %token T_FILE "file (T_FILE)" %token T_ID "identifier (T_ID)" - +%token T_INPUT "input (input string or data)" %% input @@ -121,8 +121,11 @@ params ; command - : C_CMD { fprintf(stderr, "got cmd: %s\n", $1.str); } - | C_CMD C_CMD { fprintf(stderr, "got sub: %s -> %s\n", $1.str, $2.str); } + : T_ID { fprintf(stderr, "got cmd: %s\n", $1.str); } + | T_ID T_ID { fprintf(stderr, "got sub: %s -> %s\n", $1.str, $2.str); } + /* exceptional cases below */ + | C_EVAL T_INPUT { fprintf(stderr, "got eval: %s\n", $2.str); } + | C_SHELL T_INPUT { fprintf(stderr, "got shell: %s\n", $2.str); } ; parameter @@ -132,6 +135,8 @@ parameter | T_OPLINE { $$ = $1; } | T_ID { $$ = $1; } | T_LITERAL { $$ = $1; } + | C_TRUTHY { $$ = $1; } + | C_FALSY { $$ = $1; } ; handler -- 2.40.0