phpdbg_lexer.l 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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 yyleng LEX(len)
  14. #define yytext ((char*) LEX(text))
  15. #undef YYDEBUG
  16. #define YYDEBUG(a, b)
  17. #define YYFILL(n)
  18. #define NORMAL 0
  19. #define RAW 1
  20. #define INITIAL 2
  21. ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
  22. void phpdbg_init_lexer (phpdbg_param_t *stack, char *input TSRMLS_DC) {
  23. PHPDBG_G(parser_stack) = stack;
  24. YYSETCONDITION(INITIAL);
  25. LEX(text) = YYCURSOR = (unsigned char *) input;
  26. LEX(len) = strlen(input);
  27. }
  28. int phpdbg_lex (phpdbg_param_t* yylval) {
  29. TSRMLS_FETCH(); /* Slow, but this is not a major problem here. TODO: Use TSRMLS_DC */
  30. restart:
  31. LEX(text) = YYCURSOR;
  32. /*!re2c
  33. re2c:yyfill:check = 0;
  34. T_TRUE 'true'
  35. T_YES 'yes'
  36. T_ON 'on'
  37. T_ENABLED 'enabled'
  38. T_FALSE 'false'
  39. T_NO 'no'
  40. T_OFF 'off'
  41. T_DISABLED 'disabled'
  42. T_EVAL 'ev'
  43. T_SHELL 'sh'
  44. T_IF 'if'
  45. T_RUN 'run'
  46. T_RUN_SHORT "r"
  47. WS [ \r\n\t]+
  48. DIGITS [-]?[0-9\.]+
  49. ID [^ \r\n\t:#\000]+
  50. ADDR [0][x][a-fA-F0-9]+
  51. OPCODE (ZEND_|zend_)([A-Za-z])+
  52. INPUT [^\n\000]+
  53. <!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext;
  54. <*>[\n\000] {
  55. return 0;
  56. }
  57. <NORMAL>{T_IF}{WS} {
  58. YYSETCONDITION(RAW);
  59. phpdbg_init_param(yylval, EMPTY_PARAM);
  60. return T_IF;
  61. }
  62. <NORMAL>{ID}[:]{1}[//]{2} {
  63. phpdbg_init_param(yylval, STR_PARAM);
  64. yylval->str = zend_strndup(yytext, yyleng);
  65. yylval->len = yyleng;
  66. return T_PROTO;
  67. }
  68. <NORMAL>[#]{1} {
  69. return T_POUND;
  70. }
  71. <NORMAL>[:]{2} {
  72. return T_DCOLON;
  73. }
  74. <NORMAL>[:]{1} {
  75. return T_COLON;
  76. }
  77. <NORMAL>({T_YES}|{T_ON}|{T_ENABLED}|{T_TRUE}){WS} {
  78. phpdbg_init_param(yylval, NUMERIC_PARAM);
  79. yylval->num = 1;
  80. return T_TRUTHY;
  81. }
  82. <NORMAL>({T_NO}|{T_OFF}|{T_DISABLED}|{T_FALSE}){WS} {
  83. phpdbg_init_param(yylval, NUMERIC_PARAM);
  84. yylval->num = 0;
  85. return T_FALSY;
  86. }
  87. <NORMAL>{DIGITS} {
  88. phpdbg_init_param(yylval, NUMERIC_PARAM);
  89. yylval->num = atoi(yytext);
  90. return T_DIGITS;
  91. }
  92. <NORMAL>{ADDR} {
  93. phpdbg_init_param(yylval, ADDR_PARAM);
  94. yylval->addr = strtoul(yytext, 0, 16);
  95. return T_ADDR;
  96. }
  97. <NORMAL>{OPCODE} {
  98. phpdbg_init_param(yylval, OP_PARAM);
  99. yylval->str = zend_strndup(yytext, yyleng);
  100. yylval->len = yyleng;
  101. return T_OPCODE;
  102. }
  103. <NORMAL>{ID} {
  104. phpdbg_init_param(yylval, STR_PARAM);
  105. yylval->str = zend_strndup(yytext, yyleng);
  106. yylval->len = yyleng;
  107. return T_ID;
  108. }
  109. <RAW>{INPUT} {
  110. phpdbg_init_param(yylval, STR_PARAM);
  111. yylval->str = zend_strndup(yytext, yyleng);
  112. yylval->len = yyleng;
  113. return T_INPUT;
  114. }
  115. <*>{WS} {
  116. /* ignore whitespace */
  117. goto restart;
  118. }
  119. <INITIAL>{T_EVAL}{WS} {
  120. YYSETCONDITION(RAW);
  121. phpdbg_init_param(yylval, EMPTY_PARAM);
  122. return T_EVAL;
  123. }
  124. <INITIAL>{T_SHELL}{WS} {
  125. YYSETCONDITION(RAW);
  126. phpdbg_init_param(yylval, EMPTY_PARAM);
  127. return T_SHELL;
  128. }
  129. <INITIAL>({T_RUN}|{T_RUN_SHORT}){WS} {
  130. YYSETCONDITION(RAW);
  131. phpdbg_init_param(yylval, EMPTY_PARAM);
  132. return T_RUN;
  133. }
  134. <INITIAL>. {
  135. YYSETCONDITION(NORMAL);
  136. YYCURSOR = LEX(text);
  137. goto restart;
  138. }
  139. */
  140. }