phpdbg_lexer.l 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * phpdbg_lexer.l
  3. */
  4. #include "phpdbg.h"
  5. #include "phpdbg_cmd.h"
  6. #include "phpdbg_parser.h"
  7. #define LEX(v) (PHPDBG_G(lexer).v)
  8. #define YYCTYPE unsigned char
  9. #define YYSETCONDITION(x) LEX(state) = x;
  10. #define YYGETCONDITION() LEX(state)
  11. #define YYCURSOR LEX(cursor)
  12. #define YYMARKER LEX(marker)
  13. #define YYCTXMARKER LEX(ctxmarker)
  14. #define yyleng LEX(len)
  15. #define yytext ((char*) LEX(text))
  16. #undef YYDEBUG
  17. #define YYDEBUG(a, b)
  18. #define YYFILL(n)
  19. #define NORMAL 0
  20. #define PRE_RAW 1
  21. #define RAW 2
  22. #define INITIAL 3
  23. ZEND_EXTERN_MODULE_GLOBALS(phpdbg)
  24. void phpdbg_init_lexer (phpdbg_param_t *stack, char *input) {
  25. PHPDBG_G(parser_stack) = stack;
  26. YYSETCONDITION(INITIAL);
  27. LEX(text) = YYCURSOR = (unsigned char *) input;
  28. LEX(len) = strlen(input);
  29. }
  30. static int unescape_string(char *s) {
  31. switch (*s) {
  32. case '\'':
  33. case '\"': {
  34. char start = *s;
  35. size_t off = 1;
  36. do {
  37. if (s[off] == '\\') {
  38. off++;
  39. }
  40. *s = s[off];
  41. } while ((++s)[off] != start);
  42. return off + 1;
  43. }
  44. }
  45. return 0;
  46. }
  47. int phpdbg_lex (phpdbg_param_t* yylval) {
  48. restart:
  49. LEX(text) = YYCURSOR;
  50. /*!re2c
  51. re2c:yyfill:check = 0;
  52. T_TRUE 'true'
  53. T_YES 'yes'
  54. T_ON 'on'
  55. T_ENABLED 'enabled'
  56. T_FALSE 'false'
  57. T_NO 'no'
  58. T_OFF 'off'
  59. T_DISABLED 'disabled'
  60. T_EVAL 'ev'
  61. T_SHELL 'sh'
  62. T_IF 'if'
  63. T_RUN 'run'
  64. T_RUN_SHORT "r"
  65. WS [ \r\t]+
  66. DIGITS [-]?[0-9\.]+
  67. ID [^ \r\n\t:#\000]+
  68. GENERIC_ID ([^ \r\n\t:#\000"']|":\\")+|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+[']
  69. ADDR [0][x][a-fA-F0-9]+
  70. OPCODE (ZEND_|zend_)([A-Z_a-z])+
  71. INPUT ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])+["]|[']("\\"[']|"\\\\"|[^\n\000'])+[']|[^\n\000#"'])+
  72. <!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext;
  73. <*>[\n\000] {
  74. return 0;
  75. }
  76. <PRE_RAW, NORMAL>"-r"{WS}?{DIGITS} {
  77. char *text = yytext + 2;
  78. while (*++text < '0');
  79. yylval->num = atoi(text);
  80. return T_REQ_ID;
  81. }
  82. <NORMAL>{T_IF}{WS} {
  83. YYSETCONDITION(RAW);
  84. phpdbg_init_param(yylval, EMPTY_PARAM);
  85. return T_IF;
  86. }
  87. <NORMAL>"#"/{DIGITS} {
  88. return T_POUND;
  89. }
  90. <*>"#" {
  91. YYSETCONDITION(INITIAL);
  92. return T_SEPARATOR;
  93. }
  94. <NORMAL>"::" {
  95. return T_DCOLON;
  96. }
  97. <NORMAL>":"/[^\\] {
  98. return T_COLON;
  99. }
  100. <NORMAL>{ID}"://" {
  101. phpdbg_init_param(yylval, STR_PARAM);
  102. yylval->str = estrndup(yytext, yyleng);
  103. yylval->len = yyleng;
  104. return T_PROTO;
  105. }
  106. <NORMAL>({T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE})/[ \r\t\n\000] {
  107. phpdbg_init_param(yylval, NUMERIC_PARAM);
  108. yylval->num = 1;
  109. return T_TRUTHY;
  110. }
  111. <NORMAL>({T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE})/[ \r\t\n\000] {
  112. phpdbg_init_param(yylval, NUMERIC_PARAM);
  113. yylval->num = 0;
  114. return T_FALSY;
  115. }
  116. <NORMAL>{DIGITS} {
  117. phpdbg_init_param(yylval, NUMERIC_PARAM);
  118. yylval->num = atoi(yytext);
  119. return T_DIGITS;
  120. }
  121. <NORMAL>{ADDR} {
  122. phpdbg_init_param(yylval, ADDR_PARAM);
  123. yylval->addr = strtoul(yytext, 0, 16);
  124. return T_ADDR;
  125. }
  126. <NORMAL>{OPCODE} {
  127. phpdbg_init_param(yylval, OP_PARAM);
  128. yylval->str = estrndup(yytext, yyleng);
  129. yylval->len = yyleng;
  130. return T_OPCODE;
  131. }
  132. <NORMAL>{GENERIC_ID} {
  133. phpdbg_init_param(yylval, STR_PARAM);
  134. yylval->str = estrndup(yytext, yyleng - unescape_string(yytext));
  135. yylval->len = yyleng;
  136. return T_ID;
  137. }
  138. <RAW>{INPUT} {
  139. phpdbg_init_param(yylval, STR_PARAM);
  140. yylval->str = estrdup(yytext);
  141. yylval->len = yyleng;
  142. return T_INPUT;
  143. }
  144. <*>{WS} {
  145. /* ignore whitespace */
  146. goto restart;
  147. }
  148. <INITIAL>{T_EVAL}{WS} {
  149. YYSETCONDITION(PRE_RAW);
  150. phpdbg_init_param(yylval, EMPTY_PARAM);
  151. return T_EVAL;
  152. }
  153. <INITIAL>{T_SHELL}{WS} {
  154. YYSETCONDITION(PRE_RAW);
  155. phpdbg_init_param(yylval, EMPTY_PARAM);
  156. return T_SHELL;
  157. }
  158. <INITIAL>({T_RUN}|{T_RUN_SHORT}){WS} {
  159. YYSETCONDITION(PRE_RAW);
  160. phpdbg_init_param(yylval, EMPTY_PARAM);
  161. return T_RUN;
  162. }
  163. <PRE_RAW>[^ ] {
  164. YYSETCONDITION(RAW);
  165. YYCURSOR = LEX(text);
  166. goto restart;
  167. }
  168. <INITIAL>[^ ] {
  169. YYSETCONDITION(NORMAL);
  170. YYCURSOR = LEX(text);
  171. goto restart;
  172. }
  173. */
  174. }