diff options
Diffstat (limited to 'dev')
-rw-r--r-- | dev/phpdbg_lexer.l | 52 | ||||
-rw-r--r-- | dev/phpdbg_parser.y | 44 |
2 files changed, 58 insertions, 38 deletions
diff --git a/dev/phpdbg_lexer.l b/dev/phpdbg_lexer.l index 9be1f533b0..76c28c45dd 100644 --- a/dev/phpdbg_lexer.l +++ b/dev/phpdbg_lexer.l @@ -21,16 +21,17 @@ %option reentrant noyywrap never-interactive nounistd %option bison-bridge -C_TRUE "true" -C_YES "yes" -C_ON "on" -C_ENABLED "enabled" -C_FALSE "false" -C_NO "no" -C_OFF "off" -C_DISABLED "disabled" -C_EVAL "eval" -C_SHELL "shell" +C_TRUE ?i:"true" +C_YES ?i:"yes" +C_ON ?i:"on" +C_ENABLED ?i:"enabled" +C_FALSE ?i:"false" +C_NO ?i:"no" +C_OFF ?i:"off" +C_DISABLED ?i:"disabled" +C_EVAL ?i:"eval" +C_SHELL ?i:"shell" +C_IF ?i:"if" DIGITS [0-9]+ ID [a-zA-Z_\x7f-\xff\-][a-zA-Z0-9_\x7f-\xff\-]* @@ -44,6 +45,21 @@ INPUT [^\n]+ %% <INITIAL> { + {C_EVAL} { + BEGIN(RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return C_EVAL; + } + {C_SHELL} { + BEGIN(RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return C_SHELL; + } + {C_IF} { + BEGIN(RAW); + phpdbg_init_param(yylval, EMPTY_PARAM); + return C_IF; + } {C_YES}|{C_ON}|{C_ENABLED}|{C_TRUE} { phpdbg_init_param(yylval, NUMERIC_PARAM); yylval->num = 1; @@ -54,20 +70,6 @@ INPUT [^\n]+ yylval->num = 0; return C_FALSY; } - {C_EVAL} { - BEGIN(RAW); - phpdbg_init_param(yylval, STR_PARAM); - yylval->str = strndup(yytext, yyleng); - yylval->len = yyleng; - return C_EVAL; - } - {C_SHELL} { - BEGIN(RAW); - phpdbg_init_param(yylval, STR_PARAM); - yylval->str = strndup(yytext, yyleng); - yylval->len = yyleng; - return C_SHELL; - } {DIGITS} { phpdbg_init_param(yylval, NUMERIC_PARAM); yylval->num = atoi(yytext); @@ -96,7 +98,7 @@ INPUT [^\n]+ yylval->len = yyleng; return T_LITERAL; } - {ID} { + {NSID} { phpdbg_init_param(yylval, STR_PARAM); yylval->str = strndup(yytext, yyleng); yylval->len = yyleng; diff --git a/dev/phpdbg_parser.y b/dev/phpdbg_parser.y index 713c0efccf..185283eb8e 100644 --- a/dev/phpdbg_parser.y +++ b/dev/phpdbg_parser.y @@ -45,6 +45,10 @@ void phpdbg_debug_param(const phpdbg_param_t *param, const char *msg) { case NUMERIC_PARAM: fprintf(stderr, "%s NUMERIC_PARAM(%ld)\n", msg, param->num); break; + + case COND_PARAM: + fprintf(stderr, "%s COND_PARAM(%s=%d)\n", msg, param->str, param->len); + break; } } } @@ -119,16 +123,28 @@ int phpdbg_stack_execute(phpdbg_param_t *stack, char **why) { } command = params = (phpdbg_param_t*) stack->next; - - if (command->type != STR_PARAM) { - asprintf( - why, "the first parameter is expected to be a string !!"); - return FAILURE; - } - /* do resolve command(s) */ + switch (command->type) { + case EVAL_PARAM: + phpdbg_notice("eval (%s)", command->str); + break; + + case SHELL_PARAM: + phpdbg_notice("shell (%s)", command->str); + break; + + case STR_PARAM: { + /* do resolve command(s) */ + } break; + + default: + asprintf( + why, "the first parameter makes no sense !!"); + return FAILURE; + } /* do prepare params for function */ + while (params) { phpdbg_debug_param(params, "-> ..."); params = params->next; @@ -161,6 +177,7 @@ typedef void* yyscan_t; %token C_STRING "string (some input, perhaps)" %token C_EVAL "eval" %token C_SHELL "shell" +%token C_IF "if (condition)" %token T_DIGITS "digits (numbers)" %token T_LITERAL "literal (string)" @@ -187,18 +204,18 @@ params ; normal - : T_ID { phpdbg_stack_push(stack, &$1); } - | normal T_ID { phpdbg_stack_push(stack, &$2); } + : T_ID { $$ = $1; } + | normal T_ID { $$ = $2; } ; special - : C_EVAL T_INPUT { phpdbg_stack_push(stack, &$1); phpdbg_stack_push(stack, &$2); } - | C_SHELL T_INPUT { phpdbg_stack_push(stack, &$1); phpdbg_stack_push(stack, &$2); } + : C_EVAL T_INPUT { $$ = $2; $$.type = EVAL_PARAM; } + | C_SHELL T_INPUT { $$ = $2; $$.type = SHELL_PARAM;; } ; command - : normal - | special + : normal { phpdbg_stack_push(stack, &$1); } + | special { phpdbg_stack_push(stack, &$1); } ; parameter @@ -210,6 +227,7 @@ parameter | T_LITERAL { $$ = $1; } | C_TRUTHY { $$ = $1; } | C_FALSY { $$ = $1; } + | C_IF T_INPUT { $$ = $2; $$.type = COND_PARAM; } ; handler |