1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option reentrant
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option bison-bridge
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option prefix="parse_events_"
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option stack
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%{
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h>
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../perf.h"
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-events-bison.h"
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-events.h"
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengchar *parse_events_get_text(yyscan_t yyscanner);
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengYYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __value(YYSTYPE *yylval, char *str, int base, int token)
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64 num;
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	errno = 0;
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	num = strtoull(str, NULL, base);
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (errno)
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return PE_ERROR;
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	yylval->num = num;
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return token;
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int value(yyscan_t scanner, int base)
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	YYSTYPE *yylval = parse_events_get_lval(scanner);
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *text = parse_events_get_text(scanner);
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __value(yylval, text, base, PE_VALUE);
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int raw(yyscan_t scanner)
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	YYSTYPE *yylval = parse_events_get_lval(scanner);
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *text = parse_events_get_text(scanner);
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __value(yylval, text + 1, 16, PE_RAW);
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int str(yyscan_t scanner, int token)
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	YYSTYPE *yylval = parse_events_get_lval(scanner);
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *text = parse_events_get_text(scanner);
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	yylval->str = strdup(text);
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return token;
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int sym(yyscan_t scanner, int type, int config)
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	YYSTYPE *yylval = parse_events_get_lval(scanner);
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	yylval->num = (type << 16) + config;
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int term(yyscan_t scanner, int type)
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	YYSTYPE *yylval = parse_events_get_lval(scanner);
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	yylval->num = type;
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return PE_TERM;
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%}
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%x mem
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%s config
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%x event
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenggroup		[^,{}/]*[{][^}]*[}][^,{}/]*
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengevent_pmu	[^,{}/]+[/][^/]*[/][^,{}/]*
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengevent		[^,{}/]+
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_dec		[0-9]+
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_hex		0x[a-fA-F0-9]+
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_raw_hex	[a-fA-F0-9]+
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname		[a-zA-Z_*?][a-zA-Z0-9_*?]*
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname_minus	[a-zA-Z_*?][a-zA-Z0-9\-_*?]*
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* If you add a modifier you need to update check_modifier() */
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmodifier_event	[ukhpGHSD]+
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmodifier_bp	[rwx]{1,3}
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%%
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%{
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int start_token;
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		start_token = parse_events_get_extra(yyscanner);
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (start_token == PE_START_TERMS)
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			BEGIN(config);
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		else if (start_token == PE_START_EVENTS)
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			BEGIN(event);
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (start_token) {
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			parse_events_set_extra(NULL, yyscanner);
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return start_token;
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         }
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%}
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<event>{
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{group}		{
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			BEGIN(INITIAL); yyless(0);
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{event_pmu}	|
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{event}		{
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			str(yyscanner, PE_EVENT_NAME);
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			BEGIN(INITIAL); yyless(0);
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return PE_EVENT_NAME;
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng.		|
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<<EOF>>		{
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			BEGIN(INITIAL); yyless(0);
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenginstructions					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcache-references				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcache-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch-instructions|branches			{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbus-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengref-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtask-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpage-faults|faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengminor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmajor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcontext-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengemulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengdummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengL1-dcache|l1-d|l1d|L1-data		|
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengL1-icache|l1-i|l1i|L1-instruction	|
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengLLC|L2					|
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengdTLB|d-tlb|Data-TLB			|
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengiTLB|i-tlb|Instruction-TLB		|
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch|branches|bpu|btb|bpc		|
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnode					{ return str(yyscanner, PE_NAME_CACHE_TYPE); }
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengload|loads|read				|
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstore|stores|write			|
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengprefetch|prefetches			|
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengspeculative-read|speculative-load	|
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengrefs|Reference|ops|access		|
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmisses|miss				{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<config>{
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig1			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig2			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengperiod			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch_type		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng,			{ return ','; }
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"/"			{ BEGIN(INITIAL); return '/'; }
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{name_minus}		{ return str(yyscanner, PE_NAME); }
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmem:			{ BEGIN(mem); return PE_PREFIX_MEM; }
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengr{num_raw_hex}		{ return raw(yyscanner); }
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_dec}		{ return value(yyscanner, 10); }
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_hex}		{ return value(yyscanner, 16); }
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{modifier_event}	{ return str(yyscanner, PE_MODIFIER_EVENT); }
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{name}			{ return str(yyscanner, PE_NAME); }
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"/"			{ BEGIN(config); return '/'; }
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng-			{ return '-'; }
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng,			{ BEGIN(event); return ','; }
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng:			{ return ':'; }
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"{"			{ BEGIN(event); return '{'; }
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"}"			{ return '}'; }
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng=			{ return '='; }
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng\n			{ }
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<mem>{
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{modifier_bp}		{ return str(yyscanner, PE_MODIFIER_BP); }
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng:			{ return ':'; }
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_dec}		{ return value(yyscanner, 10); }
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_hex}		{ return value(yyscanner, 16); }
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * We need to separate 'mem:' scanner part, in order to get specific
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * modifier bits parsed out. Otherwise we would need to handle PE_NAME
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * and we'd need to parse it manually. During the escape from <mem>
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * state we need to put the escaping char back, so we dont miss it.
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng.			{ unput(*yytext); BEGIN(INITIAL); }
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * We destroy the scanner after reaching EOF,
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * but anyway just to be sure get back to INIT state.
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<<EOF>>			{ BEGIN(INITIAL); }
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%%
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_wrap(void *scanner __maybe_unused)
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 1;
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
218