12 changed files with 1524 additions and 3045 deletions
-
1sapi/phpdbg/.gitignore
-
15sapi/phpdbg/Makefile.frag
-
2sapi/phpdbg/config.m4
-
7sapi/phpdbg/phpdbg.h
-
3125sapi/phpdbg/phpdbg_lexer.c
-
385sapi/phpdbg/phpdbg_lexer.h
-
270sapi/phpdbg/phpdbg_lexer.l
-
550sapi/phpdbg/phpdbg_parser.c
-
24sapi/phpdbg/phpdbg_parser.h
-
152sapi/phpdbg/phpdbg_parser.y
-
37sapi/phpdbg/phpdbg_prompt.c
-
1sapi/phpdbg/travis/ci.sh
3125
sapi/phpdbg/phpdbg_lexer.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,348 +1,41 @@ |
|||||
#ifndef yyHEADER_H |
|
||||
#define yyHEADER_H 1 |
|
||||
#define yyIN_HEADER 1 |
|
||||
|
/* |
||||
|
+----------------------------------------------------------------------+ |
||||
|
| PHP Version 5 | |
||||
|
+----------------------------------------------------------------------+ |
||||
|
| Copyright (c) 1997-2014 The PHP Group | |
||||
|
+----------------------------------------------------------------------+ |
||||
|
| This source file is subject to version 3.01 of the PHP license, | |
||||
|
| that is bundled with this package in the file LICENSE, and is | |
||||
|
| available through the world-wide-web at the following url: | |
||||
|
| http://www.php.net/license/3_01.txt | |
||||
|
| If you did not receive a copy of the PHP license and are unable to | |
||||
|
| obtain it through the world-wide-web, please send a note to | |
||||
|
| license@php.net so we can mail you a copy immediately. | |
||||
|
+----------------------------------------------------------------------+ |
||||
|
| Authors: Felipe Pena <felipe@php.net> | |
||||
|
| Authors: Joe Watkins <joe.watkins@live.co.uk> | |
||||
|
| Authors: Bob Weinand <bwoebi@php.net> | |
||||
|
+----------------------------------------------------------------------+ |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PHPDBG_LEXER_H |
||||
|
#define PHPDBG_LEXER_H |
||||
|
|
||||
|
#include "phpdbg_cmd.h" |
||||
|
|
||||
|
typedef struct { |
||||
|
unsigned int len; |
||||
|
unsigned char *text; |
||||
|
unsigned char *cursor; |
||||
|
unsigned char *marker; |
||||
|
int state; |
||||
|
} phpdbg_lexer_data; |
||||
|
|
||||
|
#define yyparse phpdbg_parse |
||||
|
#define yylex phpdbg_lex |
||||
|
|
||||
|
void phpdbg_init_lexer (phpdbg_param_t *stack, char *input TSRMLS_DC); |
||||
|
|
||||
|
int phpdbg_lex (phpdbg_param_t* yylval); |
||||
|
|
||||
#line 6 "sapi/phpdbg/phpdbg_lexer.h" |
|
||||
|
|
||||
#line 8 "sapi/phpdbg/phpdbg_lexer.h" |
|
||||
|
|
||||
#define YY_INT_ALIGNED short int |
|
||||
|
|
||||
/* A lexical scanner generated by flex */ |
|
||||
|
|
||||
#define FLEX_SCANNER |
|
||||
#define YY_FLEX_MAJOR_VERSION 2 |
|
||||
#define YY_FLEX_MINOR_VERSION 5 |
|
||||
#define YY_FLEX_SUBMINOR_VERSION 37 |
|
||||
#if YY_FLEX_SUBMINOR_VERSION > 0 |
|
||||
#define FLEX_BETA |
|
||||
#endif |
|
||||
|
|
||||
/* First, we deal with platform-specific or compiler-specific issues. */ |
|
||||
|
|
||||
/* begin standard C headers. */ |
|
||||
#include <stdio.h> |
|
||||
#include <string.h> |
|
||||
#include <errno.h> |
|
||||
#include <stdlib.h> |
|
||||
|
|
||||
/* end standard C headers. */ |
|
||||
|
|
||||
/* flex integer type definitions */ |
|
||||
|
|
||||
#ifndef FLEXINT_H |
|
||||
#define FLEXINT_H |
|
||||
|
|
||||
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ |
|
||||
|
|
||||
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L |
|
||||
|
|
||||
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, |
|
||||
* if you want the limit (max/min) macros for int types. |
|
||||
*/ |
|
||||
#ifndef __STDC_LIMIT_MACROS |
|
||||
#define __STDC_LIMIT_MACROS 1 |
|
||||
#endif |
|
||||
|
|
||||
#include <inttypes.h> |
|
||||
typedef int8_t flex_int8_t; |
|
||||
typedef uint8_t flex_uint8_t; |
|
||||
typedef int16_t flex_int16_t; |
|
||||
typedef uint16_t flex_uint16_t; |
|
||||
typedef int32_t flex_int32_t; |
|
||||
typedef uint32_t flex_uint32_t; |
|
||||
#else |
|
||||
typedef signed char flex_int8_t; |
|
||||
typedef short int flex_int16_t; |
|
||||
typedef int flex_int32_t; |
|
||||
typedef unsigned char flex_uint8_t; |
|
||||
typedef unsigned short int flex_uint16_t; |
|
||||
typedef unsigned int flex_uint32_t; |
|
||||
|
|
||||
/* Limits of integral types. */ |
|
||||
#ifndef INT8_MIN |
|
||||
#define INT8_MIN (-128) |
|
||||
#endif |
|
||||
#ifndef INT16_MIN |
|
||||
#define INT16_MIN (-32767-1) |
|
||||
#endif |
|
||||
#ifndef INT32_MIN |
|
||||
#define INT32_MIN (-2147483647-1) |
|
||||
#endif |
|
||||
#ifndef INT8_MAX |
|
||||
#define INT8_MAX (127) |
|
||||
#endif |
|
||||
#ifndef INT16_MAX |
|
||||
#define INT16_MAX (32767) |
|
||||
#endif |
|
||||
#ifndef INT32_MAX |
|
||||
#define INT32_MAX (2147483647) |
|
||||
#endif |
|
||||
#ifndef UINT8_MAX |
|
||||
#define UINT8_MAX (255U) |
|
||||
#endif |
|
||||
#ifndef UINT16_MAX |
|
||||
#define UINT16_MAX (65535U) |
|
||||
#endif |
|
||||
#ifndef UINT32_MAX |
|
||||
#define UINT32_MAX (4294967295U) |
|
||||
#endif |
|
||||
|
|
||||
#endif /* ! C99 */ |
|
||||
|
|
||||
#endif /* ! FLEXINT_H */ |
|
||||
|
|
||||
#ifdef __cplusplus |
|
||||
|
|
||||
/* The "const" storage-class-modifier is valid. */ |
|
||||
#define YY_USE_CONST |
|
||||
|
|
||||
#else /* ! __cplusplus */ |
|
||||
|
|
||||
/* C99 requires __STDC__ to be defined as 1. */ |
|
||||
#if defined (__STDC__) |
|
||||
|
|
||||
#define YY_USE_CONST |
|
||||
|
|
||||
#endif /* defined (__STDC__) */ |
|
||||
#endif /* ! __cplusplus */ |
|
||||
|
|
||||
#ifdef YY_USE_CONST |
|
||||
#define yyconst const |
|
||||
#else |
|
||||
#define yyconst |
|
||||
#endif |
|
||||
|
|
||||
/* An opaque pointer. */ |
|
||||
#ifndef YY_TYPEDEF_YY_SCANNER_T |
|
||||
#define YY_TYPEDEF_YY_SCANNER_T |
|
||||
typedef void* yyscan_t; |
|
||||
#endif |
|
||||
|
|
||||
/* For convenience, these vars (plus the bison vars far below) |
|
||||
are macros in the reentrant scanner. */ |
|
||||
#define yyin yyg->yyin_r |
|
||||
#define yyout yyg->yyout_r |
|
||||
#define yyextra yyg->yyextra_r |
|
||||
#define yyleng yyg->yyleng_r |
|
||||
#define yytext yyg->yytext_r |
|
||||
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) |
|
||||
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) |
|
||||
#define yy_flex_debug yyg->yy_flex_debug_r |
|
||||
|
|
||||
/* Size of default input buffer. */ |
|
||||
#ifndef YY_BUF_SIZE |
|
||||
#define YY_BUF_SIZE 16384 |
|
||||
#endif |
|
||||
|
|
||||
#ifndef YY_TYPEDEF_YY_BUFFER_STATE |
|
||||
#define YY_TYPEDEF_YY_BUFFER_STATE |
|
||||
typedef struct yy_buffer_state *YY_BUFFER_STATE; |
|
||||
#endif |
|
||||
|
|
||||
#ifndef YY_TYPEDEF_YY_SIZE_T |
|
||||
#define YY_TYPEDEF_YY_SIZE_T |
|
||||
typedef size_t yy_size_t; |
|
||||
#endif |
#endif |
||||
|
|
||||
#ifndef YY_STRUCT_YY_BUFFER_STATE |
|
||||
#define YY_STRUCT_YY_BUFFER_STATE |
|
||||
struct yy_buffer_state |
|
||||
{ |
|
||||
FILE *yy_input_file; |
|
||||
|
|
||||
char *yy_ch_buf; /* input buffer */ |
|
||||
char *yy_buf_pos; /* current position in input buffer */ |
|
||||
|
|
||||
/* Size of input buffer in bytes, not including room for EOB |
|
||||
* characters. |
|
||||
*/ |
|
||||
yy_size_t yy_buf_size; |
|
||||
|
|
||||
/* Number of characters read into yy_ch_buf, not including EOB |
|
||||
* characters. |
|
||||
*/ |
|
||||
yy_size_t yy_n_chars; |
|
||||
|
|
||||
/* Whether we "own" the buffer - i.e., we know we created it, |
|
||||
* and can realloc() it to grow it, and should free() it to |
|
||||
* delete it. |
|
||||
*/ |
|
||||
int yy_is_our_buffer; |
|
||||
|
|
||||
/* Whether this is an "interactive" input source; if so, and |
|
||||
* if we're using stdio for input, then we want to use getc() |
|
||||
* instead of fread(), to make sure we stop fetching input after |
|
||||
* each newline. |
|
||||
*/ |
|
||||
int yy_is_interactive; |
|
||||
|
|
||||
/* Whether we're considered to be at the beginning of a line. |
|
||||
* If so, '^' rules will be active on the next match, otherwise |
|
||||
* not. |
|
||||
*/ |
|
||||
int yy_at_bol; |
|
||||
|
|
||||
int yy_bs_lineno; /**< The line count. */ |
|
||||
int yy_bs_column; /**< The column count. */ |
|
||||
|
|
||||
/* Whether to try to fill the input buffer when we reach the |
|
||||
* end of it. |
|
||||
*/ |
|
||||
int yy_fill_buffer; |
|
||||
|
|
||||
int yy_buffer_status; |
|
||||
|
|
||||
}; |
|
||||
#endif /* !YY_STRUCT_YY_BUFFER_STATE */ |
|
||||
|
|
||||
void yyrestart (FILE *input_file ,yyscan_t yyscanner ); |
|
||||
void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); |
|
||||
YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); |
|
||||
void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); |
|
||||
void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); |
|
||||
void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); |
|
||||
void yypop_buffer_state (yyscan_t yyscanner ); |
|
||||
|
|
||||
YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); |
|
||||
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); |
|
||||
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner ); |
|
||||
|
|
||||
void *yyalloc (yy_size_t ,yyscan_t yyscanner ); |
|
||||
void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); |
|
||||
void yyfree (void * ,yyscan_t yyscanner ); |
|
||||
|
|
||||
/* Begin user sect3 */ |
|
||||
|
|
||||
#define yywrap(yyscanner) 1 |
|
||||
#define YY_SKIP_YYWRAP |
|
||||
|
|
||||
#define yytext_ptr yytext_r |
|
||||
|
|
||||
#ifdef YY_HEADER_EXPORT_START_CONDITIONS |
|
||||
#define INITIAL 0 |
|
||||
#define RAW 1 |
|
||||
#define NORMAL 2 |
|
||||
|
|
||||
#endif |
|
||||
|
|
||||
#ifndef YY_NO_UNISTD_H |
|
||||
/* Special case for "unistd.h", since it is non-ANSI. We include it way |
|
||||
* down here because we want the user's section 1 to have been scanned first. |
|
||||
* The user has a chance to override it with an option. |
|
||||
*/ |
|
||||
#include <unistd.h> |
|
||||
#endif |
|
||||
|
|
||||
#ifndef YY_EXTRA_TYPE |
|
||||
#define YY_EXTRA_TYPE void * |
|
||||
#endif |
|
||||
|
|
||||
int yylex_init (yyscan_t* scanner); |
|
||||
|
|
||||
int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); |
|
||||
|
|
||||
/* Accessor methods to globals. |
|
||||
These are made visible to non-reentrant scanners for convenience. */ |
|
||||
|
|
||||
int yylex_destroy (yyscan_t yyscanner ); |
|
||||
|
|
||||
int yyget_debug (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_debug (int debug_flag ,yyscan_t yyscanner ); |
|
||||
|
|
||||
YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); |
|
||||
|
|
||||
FILE *yyget_in (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_in (FILE * in_str ,yyscan_t yyscanner ); |
|
||||
|
|
||||
FILE *yyget_out (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_out (FILE * out_str ,yyscan_t yyscanner ); |
|
||||
|
|
||||
yy_size_t yyget_leng (yyscan_t yyscanner ); |
|
||||
|
|
||||
char *yyget_text (yyscan_t yyscanner ); |
|
||||
|
|
||||
int yyget_lineno (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_lineno (int line_number ,yyscan_t yyscanner ); |
|
||||
|
|
||||
int yyget_column (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_column (int column_no ,yyscan_t yyscanner ); |
|
||||
|
|
||||
YYSTYPE * yyget_lval (yyscan_t yyscanner ); |
|
||||
|
|
||||
void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); |
|
||||
|
|
||||
/* Macros after this point can all be overridden by user definitions in |
|
||||
* section 1. |
|
||||
*/ |
|
||||
|
|
||||
#ifndef YY_SKIP_YYWRAP |
|
||||
#ifdef __cplusplus |
|
||||
extern "C" int yywrap (yyscan_t yyscanner ); |
|
||||
#else |
|
||||
extern int yywrap (yyscan_t yyscanner ); |
|
||||
#endif |
|
||||
#endif |
|
||||
|
|
||||
#ifndef yytext_ptr |
|
||||
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); |
|
||||
#endif |
|
||||
|
|
||||
#ifdef YY_NEED_STRLEN |
|
||||
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); |
|
||||
#endif |
|
||||
|
|
||||
#ifndef YY_NO_INPUT |
|
||||
|
|
||||
#endif |
|
||||
|
|
||||
/* Amount of stuff to slurp up with each read. */ |
|
||||
#ifndef YY_READ_BUF_SIZE |
|
||||
#define YY_READ_BUF_SIZE 8192 |
|
||||
#endif |
|
||||
|
|
||||
/* Number of entries by which start-condition stack grows. */ |
|
||||
#ifndef YY_START_STACK_INCR |
|
||||
#define YY_START_STACK_INCR 25 |
|
||||
#endif |
|
||||
|
|
||||
/* Default declaration of generated scanner - a define so the user can |
|
||||
* easily add parameters. |
|
||||
*/ |
|
||||
#ifndef YY_DECL |
|
||||
#define YY_DECL_IS_OURS 1 |
|
||||
|
|
||||
extern int yylex \ |
|
||||
(YYSTYPE * yylval_param ,yyscan_t yyscanner); |
|
||||
|
|
||||
#define YY_DECL int yylex \ |
|
||||
(YYSTYPE * yylval_param , yyscan_t yyscanner) |
|
||||
#endif /* !YY_DECL */ |
|
||||
|
|
||||
/* yy_get_previous_state - get the state just before the EOB char was reached */ |
|
||||
|
|
||||
#undef YY_NEW_FILE |
|
||||
#undef YY_FLUSH_BUFFER |
|
||||
#undef yy_set_bol |
|
||||
#undef yy_new_buffer |
|
||||
#undef yy_set_interactive |
|
||||
#undef YY_DO_BEFORE_ACTION |
|
||||
|
|
||||
#ifdef YY_DECL_IS_OURS |
|
||||
#undef YY_DECL_IS_OURS |
|
||||
#undef YY_DECL |
|
||||
#endif |
|
||||
|
|
||||
#line 131 "/usr/src/php-src/sapi/phpdbg/phpdbg_lexer.l" |
|
||||
|
|
||||
|
|
||||
#line 347 "sapi/phpdbg/phpdbg_lexer.h" |
|
||||
#undef yyIN_HEADER |
|
||||
#endif /* yyHEADER_H */ |
|
||||
@ -1,131 +1,169 @@ |
|||||
%{ |
|
||||
|
|
||||
/* |
/* |
||||
* phpdbg_lexer.l |
* phpdbg_lexer.l |
||||
*/ |
*/ |
||||
|
|
||||
#include "phpdbg.h" |
#include "phpdbg.h" |
||||
#include "phpdbg_cmd.h" |
#include "phpdbg_cmd.h" |
||||
#define YYSTYPE phpdbg_param_t |
|
||||
|
|
||||
#include "phpdbg_parser.h" |
#include "phpdbg_parser.h" |
||||
|
|
||||
%} |
|
||||
|
|
||||
%s RAW |
|
||||
%s NORMAL |
|
||||
|
|
||||
%option outfile="sapi/phpdbg/phpdbg_lexer.c" header-file="sapi/phpdbg/phpdbg_lexer.h" |
|
||||
%option warn nodefault |
|
||||
|
|
||||
%option reentrant noyywrap never-interactive nounistd |
|
||||
%option bison-bridge |
|
||||
|
|
||||
T_TRUE "true" |
|
||||
T_YES "yes" |
|
||||
T_ON "on" |
|
||||
T_ENABLED "enabled" |
|
||||
T_FALSE "false" |
|
||||
T_NO "no" |
|
||||
T_OFF "off" |
|
||||
T_DISABLED "disabled" |
|
||||
T_EVAL "ev" |
|
||||
T_SHELL "sh" |
|
||||
T_IF "if" |
|
||||
T_RUN "run" |
|
||||
T_RUN_SHORT "r" |
|
||||
|
|
||||
WS [ \r\n\t]+ |
|
||||
DIGITS [0-9\.]+ |
|
||||
ID [^ \r\n\t:#]+ |
|
||||
ADDR 0x[a-fA-F0-9]+ |
|
||||
OPCODE (ZEND_|zend_)([A-Za-z])+ |
|
||||
INPUT [^\n]+ |
|
||||
%% |
|
||||
|
|
||||
<INITIAL>{ |
|
||||
{T_EVAL} { |
|
||||
BEGIN(RAW); |
|
||||
phpdbg_init_param(yylval, EMPTY_PARAM); |
|
||||
return T_EVAL; |
|
||||
} |
|
||||
{T_SHELL} { |
|
||||
BEGIN(RAW); |
|
||||
phpdbg_init_param(yylval, EMPTY_PARAM); |
|
||||
return T_SHELL; |
|
||||
} |
|
||||
{T_RUN}|{T_RUN_SHORT} { |
|
||||
BEGIN(RAW); |
|
||||
phpdbg_init_param(yylval, EMPTY_PARAM); |
|
||||
return T_RUN; |
|
||||
} |
|
||||
|
|
||||
.+ { |
|
||||
BEGIN(NORMAL); |
|
||||
REJECT; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
<NORMAL>{ |
|
||||
{T_IF} { |
|
||||
BEGIN(RAW); |
|
||||
phpdbg_init_param(yylval, EMPTY_PARAM); |
|
||||
return T_IF; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
<INITIAL,NORMAL>{ |
|
||||
{ID}[:]{1}[//]{2} { |
|
||||
phpdbg_init_param(yylval, STR_PARAM); |
|
||||
yylval->str = zend_strndup(yytext, yyleng); |
|
||||
yylval->len = yyleng; |
|
||||
return T_PROTO; |
|
||||
} |
|
||||
[#]{1} { return T_POUND; } |
|
||||
[:]{2} { return T_DCOLON; } |
|
||||
[:]{1} { return T_COLON; } |
|
||||
|
|
||||
{T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE} { |
|
||||
phpdbg_init_param(yylval, NUMERIC_PARAM); |
|
||||
yylval->num = 1; |
|
||||
return T_TRUTHY; |
|
||||
} |
|
||||
{T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE} { |
|
||||
phpdbg_init_param(yylval, NUMERIC_PARAM); |
|
||||
yylval->num = 0; |
|
||||
return T_FALSY; |
|
||||
} |
|
||||
{DIGITS} { |
|
||||
phpdbg_init_param(yylval, NUMERIC_PARAM); |
|
||||
yylval->num = atoi(yytext); |
|
||||
return T_DIGITS; |
|
||||
} |
|
||||
{ADDR} { |
|
||||
phpdbg_init_param(yylval, ADDR_PARAM); |
|
||||
yylval->addr = strtoul(yytext, 0, 16); |
|
||||
return T_ADDR; |
|
||||
} |
|
||||
{OPCODE} { |
|
||||
phpdbg_init_param(yylval, OP_PARAM); |
|
||||
yylval->str = zend_strndup(yytext, yyleng); |
|
||||
yylval->len = yyleng; |
|
||||
return T_OPCODE; |
|
||||
} |
|
||||
{ID} { |
|
||||
phpdbg_init_param(yylval, STR_PARAM); |
|
||||
yylval->str = zend_strndup(yytext, yyleng); |
|
||||
yylval->len = yyleng; |
|
||||
return T_ID; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
<RAW>{INPUT} { |
|
||||
|
#define LEX(v) (PHPDBG_G(lexer).v) |
||||
|
|
||||
|
#define YYCTYPE unsigned char |
||||
|
#define YYSETCONDITION(x) LEX(state) = x; |
||||
|
#define YYGETCONDITION() LEX(state) |
||||
|
#define YYCURSOR LEX(cursor) |
||||
|
#define YYMARKER LEX(marker) |
||||
|
#define yyleng LEX(len) |
||||
|
#define yytext ((char*) LEX(text)) |
||||
|
#undef YYDEBUG |
||||
|
#define YYDEBUG(a, b) |
||||
|
#define YYFILL(n) |
||||
|
|
||||
|
#define NORMAL 0 |
||||
|
#define RAW 1 |
||||
|
#define INITIAL 2 |
||||
|
|
||||
|
ZEND_EXTERN_MODULE_GLOBALS(phpdbg); |
||||
|
|
||||
|
void phpdbg_init_lexer (phpdbg_param_t *stack, char *input TSRMLS_DC) { |
||||
|
PHPDBG_G(parser_stack) = stack; |
||||
|
|
||||
|
YYSETCONDITION(INITIAL); |
||||
|
|
||||
|
LEX(text) = YYCURSOR = (unsigned char *) input; |
||||
|
LEX(len) = strlen(input); |
||||
|
} |
||||
|
|
||||
|
int phpdbg_lex (phpdbg_param_t* yylval) { |
||||
|
TSRMLS_FETCH(); /* Slow, but this is not a major problem here. TODO: Use TSRMLS_DC */ |
||||
|
|
||||
|
restart: |
||||
|
LEX(text) = YYCURSOR; |
||||
|
|
||||
|
/*!re2c |
||||
|
re2c:yyfill:check = 0; |
||||
|
T_TRUE "true" |
||||
|
T_YES "yes" |
||||
|
T_ON "on" |
||||
|
T_ENABLED "enabled" |
||||
|
T_FALSE "false" |
||||
|
T_NO "no" |
||||
|
T_OFF "off" |
||||
|
T_DISABLED "disabled" |
||||
|
T_EVAL "ev" |
||||
|
T_SHELL "sh" |
||||
|
T_IF "if" |
||||
|
T_RUN "run" |
||||
|
T_RUN_SHORT "r" |
||||
|
WS [ \r\n\t]+ |
||||
|
DIGITS [0-9\.]+ |
||||
|
ID [^ \r\n\t:#\000]+ |
||||
|
ADDR [0][x][a-fA-F0-9]+ |
||||
|
OPCODE (ZEND_|zend_)([A-Za-z])+ |
||||
|
INPUT [^\n\000]+ |
||||
|
|
||||
|
<!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext; |
||||
|
|
||||
|
<*>[\n\000] { |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{T_IF} { |
||||
|
YYSETCONDITION(RAW); |
||||
|
phpdbg_init_param(yylval, EMPTY_PARAM); |
||||
|
return T_IF; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{ID}[:]{1}[//]{2} { |
||||
|
phpdbg_init_param(yylval, STR_PARAM); |
||||
|
yylval->str = zend_strndup(yytext, yyleng); |
||||
|
yylval->len = yyleng; |
||||
|
return T_PROTO; |
||||
|
} |
||||
|
<NORMAL>[#]{1} { |
||||
|
return T_POUND; |
||||
|
} |
||||
|
<NORMAL>[:]{2} { |
||||
|
return T_DCOLON; |
||||
|
} |
||||
|
<NORMAL>[:]{1} { |
||||
|
return T_COLON; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE} { |
||||
|
phpdbg_init_param(yylval, NUMERIC_PARAM); |
||||
|
yylval->num = 1; |
||||
|
return T_TRUTHY; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE} { |
||||
|
phpdbg_init_param(yylval, NUMERIC_PARAM); |
||||
|
yylval->num = 0; |
||||
|
return T_FALSY; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{DIGITS} { |
||||
|
phpdbg_init_param(yylval, NUMERIC_PARAM); |
||||
|
yylval->num = atoi(yytext); |
||||
|
return T_DIGITS; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{ADDR} { |
||||
|
phpdbg_init_param(yylval, ADDR_PARAM); |
||||
|
yylval->addr = strtoul(yytext, 0, 16); |
||||
|
return T_ADDR; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{OPCODE} { |
||||
|
phpdbg_init_param(yylval, OP_PARAM); |
||||
|
yylval->str = zend_strndup(yytext, yyleng); |
||||
|
yylval->len = yyleng; |
||||
|
return T_OPCODE; |
||||
|
} |
||||
|
|
||||
|
<NORMAL>{ID} { |
||||
|
phpdbg_init_param(yylval, STR_PARAM); |
||||
|
yylval->str = zend_strndup(yytext, yyleng); |
||||
|
yylval->len = yyleng; |
||||
|
return T_ID; |
||||
|
} |
||||
|
|
||||
|
<RAW>{INPUT} { |
||||
phpdbg_init_param(yylval, STR_PARAM); |
phpdbg_init_param(yylval, STR_PARAM); |
||||
yylval->str = zend_strndup(yytext, yyleng); |
yylval->str = zend_strndup(yytext, yyleng); |
||||
yylval->len = yyleng; |
yylval->len = yyleng; |
||||
BEGIN(INITIAL); |
|
||||
return T_INPUT; |
return T_INPUT; |
||||
} |
} |
||||
|
|
||||
{WS} { /* ignore whitespace */ } |
|
||||
%% |
|
||||
|
<*>{WS} { |
||||
|
/* ignore whitespace */ |
||||
|
|
||||
|
goto restart; |
||||
|
} |
||||
|
|
||||
|
<INITIAL>{T_EVAL} { |
||||
|
YYSETCONDITION(RAW); |
||||
|
phpdbg_init_param(yylval, EMPTY_PARAM); |
||||
|
return T_EVAL; |
||||
|
} |
||||
|
<INITIAL>{T_SHELL} { |
||||
|
YYSETCONDITION(RAW); |
||||
|
phpdbg_init_param(yylval, EMPTY_PARAM); |
||||
|
return T_SHELL; |
||||
|
} |
||||
|
<INITIAL>{T_RUN}|{T_RUN_SHORT} { |
||||
|
YYSETCONDITION(RAW); |
||||
|
phpdbg_init_param(yylval, EMPTY_PARAM); |
||||
|
return T_RUN; |
||||
|
} |
||||
|
|
||||
|
<INITIAL>. { |
||||
|
YYSETCONDITION(NORMAL); |
||||
|
|
||||
|
YYCURSOR = LEX(text); |
||||
|
goto restart; |
||||
|
} |
||||
|
|
||||
|
*/ |
||||
|
} |
||||
550
sapi/phpdbg/phpdbg_parser.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue