]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/dtracy/parse.y
adding dtracy (crude early version)
[plan9front.git] / sys / src / cmd / dtracy / parse.y
1 %{
2 #include <u.h>
3 #include <libc.h>
4 #include <dtracy.h>
5 #include <bio.h>
6 #include "dat.h"
7 #include "fns.h"
8 %}
9
10 %union{
11         Node *n;
12         Symbol *sym;
13         DTExpr *e;
14         s64int num;
15         char *str;
16         Type *t;
17 }
18
19 %type <n> expr
20 %type <t> type
21
22 %token <sym> TSYM
23 %token <num> TNUM
24 %token <str> TSTR
25 %token TPRINT TPRINTF
26 %token TIF
27 %token TU8 TU16 TU32 TU64
28 %token TS8 TS16 TS32 TS64
29 %token TSTRING
30
31 %right '?'
32 %left TOR
33 %left TAND
34 %left '|'
35 %left '^'
36 %left '&'
37 %left TEQ TNE
38 %left '<' '>' TLE TGE
39 %left TLSL TLSR
40 %left '+' '-'
41 %left '*' '/' '%'
42 %left unary
43 %right castprec
44
45 %%
46
47 program: | program clause
48
49 clause: { clausebegin(); } probes optpredicate optaction { clauseend(); }
50
51 optpredicate: | TIF expr { addpred(codegen(exprcheck($2, 1))); }
52
53 optaction:
54         {
55                 addstat(STATPRINT);
56                 addarg(node(OSYM, getsym("probe")));
57         }
58         | action
59 action: '{' stats '}'
60 stats: | stats0 | stats0 ';'
61 stats0: stat | stats0 ';' stat
62
63 stat: expr { addstat(STATEXPR, exprcheck($1, 0)); }
64 | TPRINT { addstat(STATPRINT); } pelist
65 | TPRINTF { addstat(STATPRINTF); } pelist
66
67
68 pelist:
69         '(' ')'
70         | '(' arg ',' ')'
71         | '(' elist2 optcomma ')'
72         | arg optcomma
73         | elist2 optcomma
74 elist2: arg ',' arg | elist2 ',' arg
75 arg: expr { addarg(exprcheck($1, 0)); }
76 optcomma: | ','
77
78 expr:
79         TSYM { $$ = node(OSYM, $1); }
80         | TNUM { $$ = node(ONUM, $1); }
81         | TSTR { $$ = node(OSTR, $1); }
82         | expr '+' expr { $$ = node(OBIN, OPADD, $1, $3); }
83         | expr '-' expr { $$ = node(OBIN, OPSUB, $1, $3); }
84         | expr '*' expr { $$ = node(OBIN, OPMUL, $1, $3); }
85         | expr '/' expr { $$ = node(OBIN, OPDIV, $1, $3); }
86         | expr '%' expr { $$ = node(OBIN, OPMOD, $1, $3); }
87         | expr '&' expr { $$ = node(OBIN, OPAND, $1, $3); }
88         | expr '|' expr { $$ = node(OBIN, OPOR, $1, $3); }
89         | expr '^' expr { $$ = node(OBIN, OPXOR, $1, $3); }
90         | expr TLSL expr { $$ = node(OBIN, OPLSH, $1, $3); }
91         | expr TLSR expr { $$ = node(OBIN, OPRSH, $1, $3); }
92         | expr TEQ expr { $$ = node(OBIN, OPEQ, $1, $3); }
93         | expr TNE expr { $$ = node(OBIN, OPNE, $1, $3); }
94         | expr '<' expr { $$ = node(OBIN, OPLT, $1, $3); }
95         | expr TLE expr { $$ = node(OBIN, OPLE, $1, $3); }
96         | expr '>' expr { $$ = node(OBIN, OPLT, $3, $1); }
97         | expr TGE expr { $$ = node(OBIN, OPLE, $3, $1); }
98         | expr TAND expr { $$ = node(OBIN, OPLAND, $1, $3); }
99         | expr TOR expr { $$ = node(OBIN, OPLOR, $1, $3); }
100         | '-' expr %prec unary { $$ = node(OBIN, OPSUB, node(ONUM, 0LL), $2); }
101         | '~' expr %prec unary { $$ = node(OBIN, OPXNOR, node(ONUM, 0LL), $2); }
102         | '!' expr %prec unary { $$ = node(OLNOT, $2); }
103         | '(' expr ')' { $$ = $2; }
104         | expr '?' expr ':' expr %prec '?' { $$ = node(OTERN, $1, $3, $5); }
105         | '(' type ')' expr %prec castprec { $$ = node(OCAST, $2, $4); }
106
107 type:
108         TU8 { $$ = type(TYPINT, 1, 0); }
109         | TS8 { $$ = type(TYPINT, 1, 1); }
110         | TU16 { $$ = type(TYPINT, 2, 0); }
111         | TS16 { $$ = type(TYPINT, 2, 1); }
112         | TU32 { $$ = type(TYPINT, 4, 0); }
113         | TS32 { $$ = type(TYPINT, 4, 1); }
114         | TU64 { $$ = type(TYPINT, 8, 0); }
115         | TS64 { $$ = type(TYPINT, 8, 1); }
116         | TSTRING { $$ = type(TYPSTRING); }
117
118 probes:
119         TSYM { addprobe($1->name); }
120         | probes ',' TSYM { addprobe($3->name); }
121
122
123 %%