| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include <stdio.h>
- #include <stdlib.h>
- #include "node.h"
- #include "sym.h"
- typedef struct pass {
- int (*run)(void *);
- walk_fn pre;
- walk_fn post;
- } pass_t;
- typedef struct provider {
-
- } provider_t;
- typedef struct prog {
- const char *probe;
- provider_t *prov;
- node_t *ast;
- symtab_t *st;
- } prog_t;
- symtab_t symbols = { .sym = NULL, .len = 0 };
- prog_t *prog_get(void)
- {
- prog_t *p;
- p = calloc(1, sizeof(*p));
- p->st = &symbols,
- /* reads{pid()} @ quantize(arg2) */
- p->ast =
- node_expr('@',
- node_cons(
- node_expr('m',
- node_cons(
- node_ident("reads"),
- node_expr('(', node_ident("pid"))
- )
- ),
- node_expr('(',
- node_cons(
- node_ident("quantize"),
- node_ident("arg2")
- )
- )
- )
- );
- return p;
- }
- int symtab_populate(node_t *n, void *_prog)
- {
- prog_t *prog = _prog;
- if ((n->ntype != N_ATOM) || (n->atom.atype != A_IDENT))
- return 0;
- /* .IDENT/->IDENT is a struct/union member, skip */
- if (n->up
- && (n->up->ntype == N_EXPR)
- && ((n->up->expr.etype == E_DOT) || (n->up->expr.etype == E_DEREF))
- && (n != n->up->expr.arg))
- return 0;
- return sym_add(prog->st, n->atom.ident, tid_none, &n->sym);
- }
- int symtab_resolve(void *_prog)
- {
- prog_t *prog = _prog;
- return 0;
- }
- pass_t passes[] = {
- { .pre = symtab_populate },
- { .run = symtab_resolve },
- { NULL, NULL, NULL }
- };
- int main(void)
- {
- node_dump_info_t info = {
- .indent = 2,
- .fp = stdout,
- };
- prog_t *p = prog_get();
- pass_t *pass;
- int err;
- for (pass = passes; pass->run, pass->pre || pass->post; pass++) {
- err = pass->run ?
- pass->run(p) :
- node_walk(p->ast, pass->pre, pass->post, p);
- if (err)
- break;
- }
- node_dump(p->ast, &info);
- symtab_dump(p->st, stdout);
- return err;
- }
|