blob: ba67f90152f8f010e48c164996258d580152502d [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Grammar interface */
12
Fred Drakeea9cb5a2000-07-09 00:20:36 +000013#ifndef Py_GRAMMAR_H
14#define Py_GRAMMAR_H
15#ifdef __cplusplus
16extern "C" {
17#endif
18
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019#include "bitset.h" /* Sigh... */
20
21/* A label of an arc */
22
Guido van Rossumb6775db1994-08-01 11:34:53 +000023typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000024 int lb_type;
25 char *lb_str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026} label;
27
28#define EMPTY 0 /* Label number 0 is by definition the empty label */
29
30/* A list of labels */
31
Guido van Rossumb6775db1994-08-01 11:34:53 +000032typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000033 int ll_nlabels;
34 label *ll_label;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035} labellist;
36
37/* An arc from one state to another */
38
Guido van Rossumb6775db1994-08-01 11:34:53 +000039typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000040 short a_lbl; /* Label of this arc */
41 short a_arrow; /* State where this arc goes to */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042} arc;
43
44/* A state in a DFA */
45
Guido van Rossumb6775db1994-08-01 11:34:53 +000046typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000047 int s_narcs;
48 arc *s_arc; /* Array of arcs */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
Fred Drakeea9cb5a2000-07-09 00:20:36 +000050 /* Optional accelerators */
51 int s_lower; /* Lowest label index */
52 int s_upper; /* Highest label index */
53 int *s_accel; /* Accelerator */
54 int s_accept; /* Nonzero for accepting state */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055} state;
56
57/* A DFA */
58
Guido van Rossumb6775db1994-08-01 11:34:53 +000059typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000060 int d_type; /* Non-terminal this represents */
61 char *d_name; /* For printing */
62 int d_initial; /* Initial state */
63 int d_nstates;
64 state *d_state; /* Array of states */
65 bitset d_first;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066} dfa;
67
68/* A grammar */
69
Guido van Rossumb6775db1994-08-01 11:34:53 +000070typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000071 int g_ndfas;
72 dfa *g_dfa; /* Array of DFAs */
73 labellist g_ll;
74 int g_start; /* Start symbol of the grammar */
75 int g_accel; /* Set if accelerators present */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076} grammar;
77
78/* FUNCTIONS */
79
Fred Drakeea9cb5a2000-07-09 00:20:36 +000080grammar *newgrammar(int start);
81dfa *adddfa(grammar *g, int type, char *name);
82int addstate(dfa *d);
83void addarc(dfa *d, int from, int to, int lbl);
84dfa *PyGrammar_FindDFA(grammar *g, int type);
85char *typename(grammar *g, int lbl);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086
Fred Drakeea9cb5a2000-07-09 00:20:36 +000087int addlabel(labellist *ll, int type, char *str);
88int findlabel(labellist *ll, int type, char *str);
89char *PyGrammar_LabelRepr(label *lb);
90void translatelabels(grammar *g);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091
Fred Drakeea9cb5a2000-07-09 00:20:36 +000092void addfirstsets(grammar *g);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093
Fred Drakeea9cb5a2000-07-09 00:20:36 +000094void PyGrammar_AddAccelerators(grammar *g);
95void PyGrammar_RemoveAccelerators(grammar *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096
Fred Drakeea9cb5a2000-07-09 00:20:36 +000097void printgrammar(grammar *g, FILE *fp);
98void printnonterminals(grammar *g, FILE *fp);
Guido van Rossuma3309961993-07-28 09:05:47 +000099
100#ifdef __cplusplus
101}
102#endif
103#endif /* !Py_GRAMMAR_H */