summaryrefslogtreecommitdiff
path: root/sapi/phpdbg/phpdbg_lexer.l
blob: b3536feab84771a2c01b377d45f8ee36076d693a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
%{
 
/*
 * phpdbg_lexer.l
 */

#include "phpdbg.h"
#include "phpdbg_cmd.h"
#define YYSTYPE phpdbg_param_t

#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}		{
	phpdbg_init_param(yylval, STR_PARAM);
	yylval->str = zend_strndup(yytext, yyleng);
	yylval->len = yyleng;
	BEGIN(INITIAL);
	return T_INPUT;
}

{WS}        		{ /* ignore whitespace */ }
%%