6 #include <linux/compiler.h>
8 #include "expr-bison.h"
11 char *expr_get_text(yyscan_t yyscanner);
12 YYSTYPE *expr_get_lval(yyscan_t yyscanner);
14 static double __value(YYSTYPE *yylval, char *str, int token)
19 num = strtod(str, NULL);
27 static int value(yyscan_t scanner)
29 YYSTYPE *yylval = expr_get_lval(scanner);
30 char *text = expr_get_text(scanner);
32 return __value(yylval, text, NUMBER);
36 * Allow @ instead of / to be able to specify pmu/event/ without
37 * conflicts with normal division.
39 static char *normalize(char *str, int runtime)
47 else if (*str == '?') {
50 int size = asprintf(¶mval, "%d", runtime);
56 *dst++ = paramval[i++];
69 static int str(yyscan_t scanner, int token, int runtime)
71 YYSTYPE *yylval = expr_get_lval(scanner);
72 char *text = expr_get_text(scanner);
74 yylval->str = normalize(strdup(text), runtime);
78 yylval->str = normalize(yylval->str, runtime);
82 static int literal(yyscan_t scanner)
84 YYSTYPE *yylval = expr_get_lval(scanner);
86 yylval->num = expr__get_literal(expr_get_text(scanner));
87 if (isnan(yylval->num))
94 number ([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)(e-?[0-9]+)?
98 sym [0-9a-zA-Z_\.:@?]+
99 symbol ({spec}|{sym})+
100 literal #[0-9a-zA-Z_\.\-]+
103 struct expr_scanner_ctx *sctx = expr_get_extra(yyscanner);
105 d_ratio { return D_RATIO; }
109 else { return ELSE; }
110 source_count { return SOURCE_COUNT; }
111 {literal} { return literal(yyscanner); }
112 {number} { return value(yyscanner); }
113 {symbol} { return str(yyscanner, ID, sctx->runtime); }
130 int expr_wrap(void *scanner __maybe_unused)