mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-05 01:20:42 +00:00
768e812e45
* On windows it's strongly desired to be able to compile straight out of a clean checkout or source download. This means anyone can download the source and investigate something quickly, without having to worry about the hassle of figuring out how the project downloads 3rd party dependencies, fetching them, getting them registered in the right place. * This can't be put in a submodule as git submodules don't get downloaded by default so people new to git will get confusing compilation messages, and someone downloading the source from github directly without cloning via git won't get submodules included. * It does add some extra size to a fresh download/checkout which is unfortunate, but absolutely worth the cost. Shallow checkouts still aren't unfeasibly large, and it's only a one-off cost at clone time.
95 lines
2.0 KiB
C
95 lines
2.0 KiB
C
|
|
/* Grammar interface */
|
|
|
|
#ifndef Py_GRAMMAR_H
|
|
#define Py_GRAMMAR_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "bitset.h" /* Sigh... */
|
|
|
|
/* A label of an arc */
|
|
|
|
typedef struct {
|
|
int lb_type;
|
|
char *lb_str;
|
|
} label;
|
|
|
|
#define EMPTY 0 /* Label number 0 is by definition the empty label */
|
|
|
|
/* A list of labels */
|
|
|
|
typedef struct {
|
|
int ll_nlabels;
|
|
label *ll_label;
|
|
} labellist;
|
|
|
|
/* An arc from one state to another */
|
|
|
|
typedef struct {
|
|
short a_lbl; /* Label of this arc */
|
|
short a_arrow; /* State where this arc goes to */
|
|
} arc;
|
|
|
|
/* A state in a DFA */
|
|
|
|
typedef struct {
|
|
int s_narcs;
|
|
arc *s_arc; /* Array of arcs */
|
|
|
|
/* Optional accelerators */
|
|
int s_lower; /* Lowest label index */
|
|
int s_upper; /* Highest label index */
|
|
int *s_accel; /* Accelerator */
|
|
int s_accept; /* Nonzero for accepting state */
|
|
} state;
|
|
|
|
/* A DFA */
|
|
|
|
typedef struct {
|
|
int d_type; /* Non-terminal this represents */
|
|
char *d_name; /* For printing */
|
|
int d_initial; /* Initial state */
|
|
int d_nstates;
|
|
state *d_state; /* Array of states */
|
|
bitset d_first;
|
|
} dfa;
|
|
|
|
/* A grammar */
|
|
|
|
typedef struct {
|
|
int g_ndfas;
|
|
dfa *g_dfa; /* Array of DFAs */
|
|
labellist g_ll;
|
|
int g_start; /* Start symbol of the grammar */
|
|
int g_accel; /* Set if accelerators present */
|
|
} grammar;
|
|
|
|
/* FUNCTIONS */
|
|
|
|
grammar *newgrammar(int start);
|
|
void freegrammar(grammar *g);
|
|
dfa *adddfa(grammar *g, int type, const char *name);
|
|
int addstate(dfa *d);
|
|
void addarc(dfa *d, int from, int to, int lbl);
|
|
dfa *PyGrammar_FindDFA(grammar *g, int type);
|
|
|
|
int addlabel(labellist *ll, int type, const char *str);
|
|
int findlabel(labellist *ll, int type, const char *str);
|
|
const char *PyGrammar_LabelRepr(label *lb);
|
|
void translatelabels(grammar *g);
|
|
|
|
void addfirstsets(grammar *g);
|
|
|
|
void PyGrammar_AddAccelerators(grammar *g);
|
|
void PyGrammar_RemoveAccelerators(grammar *);
|
|
|
|
void printgrammar(grammar *g, FILE *fp);
|
|
void printnonterminals(grammar *g, FILE *fp);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_GRAMMAR_H */
|