/[MITgcm]/mitgcm.org/devel/buildweb/code-browser/DefinitionParser/Getcomm.lex
ViewVC logotype

Annotation of /mitgcm.org/devel/buildweb/code-browser/DefinitionParser/Getcomm.lex

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1.1.1 - (hide annotations) (download) (vendor branch)
Fri Sep 20 19:47:31 2002 UTC (22 years, 9 months ago) by adcroft
Branch: Import, MAIN
CVS Tags: baseline, HEAD
Changes since 1.1: +0 -0 lines
Importing web-site building process.

1 adcroft 1.1 /*
2    
3     Simple lexical analyser for finding and extracting "definition statements". This
4     analyser finds "definition statements" within Fortran
5     comment blocks. An analyser to find "definition statements"
6     in other languages would look very similar.
7     A "definition statement" consists of a name_list
8     block and a descriptioin block, separated by a delimiter.
9     A single definition statement can have formats of the style
10    
11     name_list :: description
12    
13     -or-
14    
15     name_list, :: description
16     name_list :: description
17     :: description
18    
19     -or-
20    
21     name_list, :: description
22     name_list, :: description
23     name_list ::
24    
25     -or-
26    
27     name_list :: description
28     :: description
29    
30     The name_list entries to the left of the ' ::' delimiter are the definition statements
31     name_list block. The description entries to the right of the ' ::' delimiter are the
32     definition statements description block.
33    
34     description is text up to a new line.
35     name_list is a list of one or more names, separated by white space or other
36     punctuation (-,+,*,etc....). A name is a variable name, CPP symbol, procedure name
37     etc...
38     The :: delimiter must have at least one blank preceeding it. This is required so
39     that the C++ :: syntax for delimiting objects in a class is not interpreted as a definition
40     statement.
41    
42     These statements are used in structured commentary to provide
43     definition documentation of variables, procedures etc... that can be extracted
44     automatically for use in code synopsis documents and for use in code analysis.
45    
46     This lexer works with Fortran [CcDd] in column one comments.
47     A very similar lexer could be used for C and C++ style one-line
48     and multi-live comments, as well as for Fortran ! comments.
49    
50     Grammar that has to be recognised and processed is
51    
52     1. COMMENT_STARTED name_list DESCRIP_DELIM descrip_text EOL
53     2. COMMENT_STARTED name_list COMMA DESCRIP_DELIM descrip_text EOL
54     3. COMMENT_STARTED DESCRIP_DELIM descrip_text EOL
55     4. COMMENT_STARTED name_list EOL
56     5. COMMENT_STARTED name_list COMMA EOL
57     6. COMMENT_STARTED EOL
58    
59     1. This is recognised as a terminal record defining a list of variables
60     associated with accumulated descrip_text. The description can continue
61     over subsequent lines, but if there is a name_list on a subsequent line
62     it will be assumed to be the start of another definition statement.
63    
64     2. This is recognised as an intermediate record defining a list of variables
65     associated with accumulated descrip_text. The name_list COMMA syntax is
66     the only way to indicate that a name_list spanning several lines in a file
67     shares a single description block.
68    
69     3. This is recognised as a continued line of description for the
70     immediately preceeding variable list.
71    
72     4.,5.,6. These are recognised as valid grammr and are ignored.
73    
74     NAME_LIST and DESCRIP_TEXT pass strings to the parser. Other states
75     just set line number, character number and token id.
76    
77     */
78    
79     /* Set limits for internal tables so they don't overflow */
80     %p 100000
81     %o 100000
82     %n 100000
83     %k 100000
84     %e 100000
85     %x COMMENT_STARTED
86     %x IN_DESCRIP
87     %x NOT_A_COMMENT
88     %option noyywrap
89    
90     /* Things we will match */
91     NAME [_a-zA-Z]+[_a-zA-Z0-9.]*
92     DSPLIT [ ]*::
93     COMMA ,
94    
95     %{
96     #define DP(a)
97     #include "string.h"
98     #include "stdio.h"
99     #include "Getcomm.tab.h"
100     /* Line and character no. counter */
101     int Lno=1;int Cno=1;
102     int call1Getcommlex = 0;
103     #include "GLOBALS.h"
104     %}
105    
106    
107     %%
108    
109     if ( call1Getcommlex == 0 ) {
110     BEGIN(NOT_A_COMMENT);
111     call1Getcommlex = 1;
112     namecount=0;
113     descriptcount=0;
114     name_open=0;
115     descript_open=0;
116     }
117    
118    
119     <NOT_A_COMMENT>^[CcDd] { /* A comment starts */
120     Cno=Cno+Getcommleng; /* In Fortran this is a C in column 1 */
121     BEGIN(COMMENT_STARTED); /* Could also do C-style and ! style */
122     DP(fprintf(stdout,"<COMMENT_START>\n");)
123     return(COMMENT_START);
124     }
125    
126     <COMMENT_STARTED>{NAME} { /* In the start of a comment any word */
127     Cno=Cno+Getcommleng; /* could be a name part of a definition */
128     DP(fprintf(stdout,"<NAME>\n");) /* statement.. */
129     DP(fprintf(stdout,"%s",Getcommtext);) /* ACTION: */
130     DP(fprintf(stdout,"\n<\\NAME>\n");) /* Return NAME token and value */
131     /* strdup name onto stack; increment name stack counter */
132     namearr[namecount]=strdup(Getcommtext);
133     ++namecount; if ( namecount == MAX_NAMEARR ) {
134     fflush(stdout);
135     fprintf(stderr,"namecount == %d, need to increase MAX_NAMEARR in Getcomm.lex\n", namecount);
136     exit(-1);
137     }
138     return(NAME);
139     }
140    
141     <COMMENT_STARTED>{DSPLIT} { /* Description separator found. Set context */
142     Cno=Cno+Getcommleng; /* to in description. */
143     BEGIN(IN_DESCRIP); /* ACTION: */
144     DP(fprintf(stdout,"<DESCRIP_DELIM>\n");) /* Return DESCRIP_DELIM token */
145     return(DESCRIP_DELIM);
146     }
147    
148     <COMMENT_STARTED>{COMMA} { /* Match commas specially as these are used */
149     Cno=Cno+Getcommleng; /* to find extended lists of variable names */
150     DP(fprintf(stdout,"<COMMA>\n");) /* ACTION: */
151     return(COMMA); /* Return COMMA token */
152     }
153    
154     <COMMENT_STARTED>\n {
155     Lno=Lno+1;
156     Cno=1;
157     BEGIN(NOT_A_COMMENT); /* ACTION: */
158     DP(fprintf(stdout,"\n<\\COMMENT_START>\n");) /* Return EOL token */
159     return(EOL);
160     }
161    
162     <COMMENT_STARTED>[ ] {
163     /* ACTION: */
164     Cno=1; /* Return SPACE token */
165     return(SPACE);
166     }
167    
168     <COMMENT_STARTED>. {
169     /* ACTION: */
170     Cno=1; /* Return PUNCT token */
171     return(PUNCT);
172     }
173    
174     <IN_DESCRIP>. {
175     Cno=Cno+Getcommleng;
176     DP(fprintf(stdout,"<DESCRIP_TEXT>\n");) /* ACTION: */
177     DP(fprintf(stdout,"%s",Getcommtext);) /* Return DESCRIPT token and value */
178     DP(fprintf(stdout,"\n<\\DESCRIP_TEXT>\n");)
179     /* strdup text onto stack; increment text stack counter */
180     descriparr[descriptcount]=strdup(Getcommtext);
181     ++descriptcount; if ( descriptcount == MAX_DESCRIPARR ) {
182     fflush(stdout);
183     fprintf(stderr,"descriptcount == %d, need to increase MAX_DESCRIPARR in Getcomm.lex\n", descriptcount);
184     exit(-1);
185     }
186     return(PUNCT);
187     }
188    
189     <IN_DESCRIP>\n {
190     Lno=Lno+1;
191     Cno=Cno+Getcommleng;
192     BEGIN(NOT_A_COMMENT);
193     DP(fprintf(stdout,"<EOL>\n");) /* ACTION: */
194     DP(fprintf(stdout,"<\\COMMENT_START>\n");) /* Return EOL token */
195     return(EOL);
196     }
197    
198     <NOT_A_COMMENT>\n {
199     Lno=Lno+1; Cno=1; /* ACTION: */
200     /* Skip */
201     }
202    
203     <NOT_A_COMMENT>. {
204     Cno=Cno+Getcommleng; /* ACTION: */
205     } /* Skip */
206    
207     . {
208     Cno=Cno+Getcommleng; /* ACTION: */
209     } /* Skip */
210    
211     \n {
212     Lno=Lno+1; Cno=1; /* ACTION: */
213     } /* Skip */
214     %%
215    
216     int Getcommdebug;
217     main()
218     {
219    
220     Getcommparse();
221    
222     }

  ViewVC Help
Powered by ViewVC 1.1.22