]> granicus.if.org Git - php/commitdiff
betterness
authorkrakjoe <joe.watkins@live.co.uk>
Sat, 15 Feb 2014 19:51:39 +0000 (19:51 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sat, 15 Feb 2014 19:51:39 +0000 (19:51 +0000)
phpdbg_lexer.l
phpdbg_parser.y

index eb93d130f06ded89cbb05974e134963828bba81e..73998c3d99473d142951ba3e3daf1ceeec55a636 100644 (file)
@@ -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 **/
index ef3dca58bb6d13e377deb6fe42a02f4f067e2b91..fa53e7956f74a72077798bd541c8528a5acd63d7 100644 (file)
@@ -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