ack/util/mcgg/iburg.h

89 lines
2.3 KiB
C
Raw Normal View History

2016-09-20 18:37:16 +00:00
#ifndef BURG_INCLUDED
#define BURG_INCLUDED
/* $Id$ */
/* iburg.c: */
extern char* stringf(char* fmt, ...);
typedef struct stringlist* Stringlist;
struct stringlist {
const char* payload;
Stringlist next;
};
extern Stringlist pushstring(const char* data, Stringlist list);
2016-09-20 18:37:16 +00:00
2016-09-20 19:00:16 +00:00
typedef enum
{
TERM = 1,
NONTERM
} Kind;
typedef struct rule* Rule;
typedef struct term* Term;
struct term
{ /* terminals: */
char* name; /* terminal name */
Kind kind; /* TERM */
int esn; /* external symbol number */
int arity; /* operator arity */
Term link; /* next terminal in esn order */
Rule rules; /* rules whose pattern starts with term */
2016-09-20 18:37:16 +00:00
};
2016-09-20 19:00:16 +00:00
typedef struct nonterm* Nonterm;
struct nonterm
{ /* non-terminals: */
char* name; /* non-terminal name */
Kind kind; /* NONTERM */
int number; /* identifying number */
int lhscount; /* # times nt appears in a rule lhs */
int reached; /* 1 iff reached from start non-terminal */
Rule rules; /* rules w/non-terminal on lhs */
Rule chain; /* chain rules w/non-terminal on rhs */
Nonterm link; /* next terminal in number order */
2016-09-20 18:37:16 +00:00
};
2016-09-20 19:00:16 +00:00
extern Nonterm nonterm(char* id);
extern Term term(char* id, int esn);
2016-09-20 18:37:16 +00:00
2016-09-20 19:00:16 +00:00
typedef struct tree* Tree;
struct tree
{ /* tree patterns: */
void* op; /* a terminal or non-terminal */
Tree left, right; /* operands */
int nterms; /* number of terminal nodes in this tree */
2016-09-20 18:37:16 +00:00
};
2016-09-20 19:00:16 +00:00
extern Tree tree(char* op, Tree left, Tree right);
2016-09-20 18:37:16 +00:00
2016-09-20 19:00:16 +00:00
struct rule
{ /* rules: */
Nonterm lhs; /* lefthand side non-terminal */
Tree pattern; /* rule pattern */
int ern; /* external rule number */
int packed; /* packed external rule number */
int cost; /* associated cost */
Rule link; /* next rule in ern order */
Rule next; /* next rule with same pattern root */
Rule chain; /* next chain rule with same rhs */
Rule decode; /* next rule with same lhs */
Rule kids; /* next rule with same burm_kids pattern */
Stringlist when; /* C predicate string */
2016-09-20 18:37:16 +00:00
};
extern Rule rule(char* id, Tree pattern, int ern, Stringlist when, int cost);
2016-09-20 19:00:16 +00:00
extern int maxcost; /* maximum cost */
2016-09-20 18:37:16 +00:00
/* gram.y: */
2016-09-20 19:00:16 +00:00
void yyerror(char* fmt, ...);
2016-09-20 18:37:16 +00:00
int yyparse(void);
2016-09-20 19:00:16 +00:00
void yywarn(char* fmt, ...);
2016-09-20 18:37:16 +00:00
extern int errcnt;
2016-09-20 19:00:16 +00:00
extern FILE* infp;
extern FILE* outfp;
2016-09-20 18:37:16 +00:00
/* Stupid flex imports --- why mo header file? */
extern FILE* yyin;
extern int yylineno;
extern void printlineno(void);
2016-09-20 18:37:16 +00:00
#endif