com php-src: betterness: phpdbg_lexer.l phpdbg_parser .y
| From: | Bob Weinand | Date: | Sat, 15 Feb 2014 19:51:39 +0000 |
| Subject: | com php-src: betterness: phpdbg_lexer.l phpdbg_parser .y | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-77076@lists.php.net to get a copy of this message | ||
Commit: a01853de7890a3058a79666d1359b63b729d586a
Author: krakjoe <joe.watkins@live.co.uk> Sat, 15 Feb 2014 19:51:39 +0000
Parents: 5778e010b7a5db3229d925c6a93c88f6dc78bc9e
Branches: PHP-5.6
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=a01853de7890a3058a79666d1359b63b729d586a
Log:
betterness
Changed paths:
M phpdbg_lexer.l
M phpdbg_parser.y
Diff:
diff --git a/phpdbg_lexer.l b/phpdbg_lexer.l
index eb93d13..73998c3 100644
--- a/phpdbg_lexer.l
+++ b/phpdbg_lexer.l
@@ -13,6 +13,8 @@
#include <string.h>
%}
+%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} { }
+<INITIAL>
+{
+ {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]+ {
+<RAW>{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 ef3dca5..fa53e79 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