You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.1 KiB
93 lines
2.1 KiB
|
|
/* 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); |
|
dfa *adddfa(grammar *g, int type, 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, char *str); |
|
int findlabel(labellist *ll, int type, char *str); |
|
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 */
|
|
|