summaryrefslogtreecommitdiff
path: root/sapi/phpdbg/phpdbg_parser.y
diff options
context:
space:
mode:
authorBob Weinand <bobwei9@hotmail.com>2014-06-09 10:06:29 +0200
committerBob Weinand <bobwei9@hotmail.com>2014-06-09 10:06:29 +0200
commit6adc30028cfd04a1c6bcb0866de2fb22dae49ef5 (patch)
tree0e46646d08d8b28a3e02de8b9eab1a9bf52b166a /sapi/phpdbg/phpdbg_parser.y
parentbe133d4eebb3856d76e935d618b2cccb262145b4 (diff)
parent158b03fdef46458604d9ada7560f062bd36b8ef6 (diff)
downloadphp-git-6adc30028cfd04a1c6bcb0866de2fb22dae49ef5.tar.gz
Merge sapi/phpdbg into PHP-5.6
Diffstat (limited to 'sapi/phpdbg/phpdbg_parser.y')
-rw-r--r--sapi/phpdbg/phpdbg_parser.y152
1 files changed, 84 insertions, 68 deletions
diff --git a/sapi/phpdbg/phpdbg_parser.y b/sapi/phpdbg/phpdbg_parser.y
index 4a84504e2e..fd81edfc29 100644
--- a/sapi/phpdbg/phpdbg_parser.y
+++ b/sapi/phpdbg/phpdbg_parser.y
@@ -1,4 +1,3 @@
-%error-verbose
%{
/*
@@ -19,23 +18,15 @@
#include "phpdbg_parser.h"
#include "phpdbg_lexer.h"
+#undef yyerror
+static int yyerror(void ***tsrm_ls, const char *msg);
+
ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
-int yyerror(phpdbg_param_t *stack, yyscan_t scanner, const char *msg) {
- TSRMLS_FETCH();
- phpdbg_error("Parse Error: %s", msg);
- {
- const phpdbg_param_t *top = stack;
-
- while (top) {
- phpdbg_param_debug(
- top, "--> ");
- top = top->next;
- }
- }
- return 0;
-}
%}
+
+%pure-parser
+%error-verbose
%code requires {
#include "phpdbg.h"
@@ -44,59 +35,58 @@ int yyerror(phpdbg_param_t *stack, yyscan_t scanner, const char *msg) {
typedef void* yyscan_t;
#endif
}
+
+%parse-param { void *tsrm_ls }
+
%output "sapi/phpdbg/phpdbg_parser.c"
%defines "sapi/phpdbg/phpdbg_parser.h"
-
-%define api.pure
-%lex-param { yyscan_t scanner }
-%parse-param { phpdbg_param_t *stack }
-%parse-param { yyscan_t scanner }
-
-%token T_EVAL "eval"
-%token T_RUN "run"
-%token T_SHELL "shell"
-%token T_IF "if (condition)"
-%token T_TRUTHY "truthy (true, on, yes or enabled)"
-%token T_FALSY "falsy (false, off, no or disabled)"
-%token T_STRING "string (some input, perhaps)"
-%token T_COLON ": (colon)"
-%token T_DCOLON ":: (double colon)"
-%token T_POUND "# (pound sign)"
-%token T_PROTO "protocol (file://)"
-%token T_DIGITS "digits (numbers)"
-%token T_LITERAL "literal (string)"
-%token T_ADDR "address"
-%token T_OPCODE "opcode"
-%token T_ID "identifier (command or function name)"
-%token T_INPUT "input (input string or data)"
-%token T_UNEXPECTED "input"
-%%
+
+%token T_EVAL "eval"
+%token T_RUN "run"
+%token T_SHELL "shell"
+%token T_IF "if (condition)"
+%token T_TRUTHY "truthy (true, on, yes or enabled)"
+%token T_FALSY "falsy (false, off, no or disabled)"
+%token T_STRING "string (some input, perhaps)"
+%token T_COLON ": (colon)"
+%token T_DCOLON ":: (double colon)"
+%token T_POUND "# (pound sign)"
+%token T_PROTO "protocol (file://)"
+%token T_DIGITS "digits (numbers)"
+%token T_LITERAL "literal (string)"
+%token T_ADDR "address"
+%token T_OPCODE "opcode"
+%token T_ID "identifier (command or function name)"
+%token T_INPUT "input (input string or data)"
+%token T_UNEXPECTED "input"
+
+%% /* Rules */
input
- : parameters
- | /* nothing */
- ;
+ : parameters
+ | full_expression { phpdbg_stack_push(PHPDBG_G(parser_stack), &$1); }
+ | /* nothing */
+ ;
parameters
- : parameter { phpdbg_stack_push(stack, &$1); }
- | parameters parameter { phpdbg_stack_push(stack, &$2); }
+ : parameter { phpdbg_stack_push(PHPDBG_G(parser_stack), &$1); }
+ | parameters parameter { phpdbg_stack_push(PHPDBG_G(parser_stack), &$2); }
;
parameter
- : T_ID T_COLON T_DIGITS {
+ : T_ID T_COLON T_DIGITS {
$$.type = FILE_PARAM;
$$.file.name = $2.str;
$$.file.line = $3.num;
}
- | T_ID T_COLON T_POUND T_DIGITS {
+ | T_ID T_COLON T_POUND T_DIGITS {
$$.type = NUMERIC_FILE_PARAM;
$$.file.name = $1.str;
$$.file.line = $4.num;
}
- | T_PROTO T_ID T_COLON T_DIGITS {
+ | T_PROTO T_ID T_COLON T_DIGITS {
$$.type = FILE_PARAM;
- $$.file.name = malloc($1.len +
- $2.len + 1);
+ $$.file.name = malloc($1.len + $2.len + 1);
if ($$.file.name) {
memcpy(&$$.file.name[0], $1.str, $1.len);
memcpy(&$$.file.name[$1.len], $2.str, $2.len);
@@ -104,10 +94,9 @@ parameter
}
$$.file.line = $4.num;
}
- | T_PROTO T_ID T_COLON T_POUND T_DIGITS {
+ | T_PROTO T_ID T_COLON T_POUND T_DIGITS {
$$.type = NUMERIC_FILE_PARAM;
- $$.file.name = malloc($1.len +
- $2.len + 1);
+ $$.file.name = malloc($1.len + $2.len + 1);
if ($$.file.name) {
memcpy(&$$.file.name[0], $1.str, $1.len);
memcpy(&$$.file.name[$1.len], $2.str, $2.len);
@@ -115,54 +104,81 @@ parameter
}
$$.file.line = $5.num;
}
- | T_ID T_DCOLON T_ID {
+ | T_ID T_DCOLON T_ID {
$$.type = METHOD_PARAM;
$$.method.class = $1.str;
$$.method.name = $3.str;
}
- | T_ID T_DCOLON T_ID T_POUND T_DIGITS {
+ | T_ID T_DCOLON T_ID T_POUND T_DIGITS {
$$.type = NUMERIC_METHOD_PARAM;
$$.method.class = $1.str;
$$.method.name = $3.str;
$$.num = $5.num;
}
- | T_ID T_POUND T_DIGITS {
+ | T_ID T_POUND T_DIGITS {
$$.type = NUMERIC_FUNCTION_PARAM;
$$.str = $1.str;
$$.len = $1.len;
$$.num = $3.num;
}
- | T_IF T_INPUT {
+ | T_OPCODE { $$ = $1; }
+ | T_ADDR { $$ = $1; }
+ | T_LITERAL { $$ = $1; }
+ | T_TRUTHY { $$ = $1; }
+ | T_FALSY { $$ = $1; }
+ | T_DIGITS { $$ = $1; }
+ | T_ID { $$ = $1; }
+ ;
+
+full_expression
+ : T_IF T_INPUT {
$$.type = COND_PARAM;
$$.str = $2.str;
$$.len = $2.len;
}
- | T_EVAL T_INPUT {
+ | T_EVAL T_INPUT {
$$.type = EVAL_PARAM;
$$.str = $2.str;
$$.len = $2.len;
}
- | T_SHELL T_INPUT {
+ | T_SHELL T_INPUT {
$$.type = SHELL_PARAM;
$$.str = $2.str;
$$.len = $2.len;
}
- | T_RUN {
+ | T_RUN {
$$.type = RUN_PARAM;
$$.len = 0;
}
- | T_RUN T_INPUT {
+ | T_RUN T_INPUT {
$$.type = RUN_PARAM;
$$.str = $2.str;
$$.len = $2.len;
}
- | T_OPCODE { $$ = $1; }
- | T_ADDR { $$ = $1; }
- | T_LITERAL { $$ = $1; }
- | T_TRUTHY { $$ = $1; }
- | T_FALSY { $$ = $1; }
- | T_DIGITS { $$ = $1; }
- | T_ID { $$ = $1; }
;
%%
+
+static int yyerror(void ***tsrm_ls, const char *msg) {
+ phpdbg_error("Parse Error: %s", msg);
+
+ {
+ const phpdbg_param_t *top = PHPDBG_G(parser_stack);
+
+ while (top) {
+ phpdbg_param_debug(top, "--> ");
+ top = top->next;
+ }
+ }
+ return 0;
+}
+
+int phpdbg_do_parse(phpdbg_param_t *stack, char *input TSRMLS_DC) {
+ phpdbg_init_lexer(stack, input TSRMLS_CC);
+
+#ifdef ZTS
+ return yyparse(TSRMLS_C);
+#else
+ return yyparse(NULL);
+#endif
+}