source: trunk/athena/bin/discuss/client/trn_expr.y @ 23978

Revision 23978, 4.3 KB checked in by broder, 15 years ago (diff)
In discuss: * Move the single-letter checks in trn_expr.y:yylex to the bottom of the function so that they get caught after commands that start with those letters. (Trac: #346)
Line 
1%token INTEGER NREF PREF FIRST LAST NEXT PREV FREF LREF CUR NEW ALL AREF
2%left '+' '-'
3%{
4#include <ctype.h>
5#include <discuss/discuss.h>
6#include "globals.h"
7
8static trn_info *trnexpr_curtrn;
9static mtg_info *trnexpr_curmtg;
10static int trnexpr_low, trnexpr_high;
11static int trnexpr_aref;
12static char *cp;
13static int trnexpr_err;
14%}
15
16%%
17range   : trn_no
18                { trnexpr_low = $1;
19                  trnexpr_high = $1;
20                }
21        | trn_no sep trn_no
22                { trnexpr_low = $1;
23                  trnexpr_high = $3;
24                }
25        | NEW
26                { trnexpr_low = dsc_public.highest_seen+1;
27                  trnexpr_high = trnexpr_curmtg->last;
28                }
29        | ALL
30                { trnexpr_low = trnexpr_curmtg->first;
31                  trnexpr_high = trnexpr_curmtg->last;
32                }
33        | AREF
34                { trnexpr_low = trnexpr_curtrn->current;
35                  trnexpr_high = trnexpr_curtrn->current;
36                  trnexpr_aref = 1;
37                }
38
39        ;         
40sep     : ':'
41        | ','
42        ;
43
44trn_no  : INTEGER
45        | NREF
46        | PREF
47        | FIRST
48        | LAST
49        | NEXT
50        | PREV
51        | FREF
52        | LREF
53        | CUR
54        | expr
55        ;
56
57expr    : trn_no '-' trn_no
58                { $$ = $1 - $3; }
59        | trn_no '+' trn_no
60                { $$ = $1 + $3; }
61        ;
62%%
63
64/*
65 *
66 *      Copyright (C) 1989 by the Massachusetts Institute of Technology
67 *      Developed by the MIT Student Information Processing Board (SIPB).
68 *      For copying information, see the file mit-copyright.h in this release.
69 *
70 */
71
72yyerror(msg)
73        char *msg;
74{
75#ifdef  lint
76        msg = msg;
77#endif  /* lint */
78        trnexpr_err = DISC_INVALID_TRN_SPECS;
79}
80
81/*
82 *
83 * see if second string is beginning of first string, except for case
84 * differences..
85 *
86 */
87
88#define to_lower(c)     (((c)<'_')?((c)+'a'-'A'):(c))
89static match(s1, s2)
90        register char *s1, *s2;
91{
92        while (*s2) {
93                if (to_lower(*s1) != *s2)
94                        return(0);
95                s1++; s2++;
96        }
97        return(1);
98}
99
100yylex()
101{
102        if (!*cp) return -1;
103        if(isdigit(*cp)) {
104                yylval=0;
105                do {
106                        yylval = *(cp++) - '0' + yylval*10;
107                } while (*cp && isdigit(*cp));
108                return( INTEGER );
109        } else if (*cp=='.') {
110                cp++;
111                yylval=trnexpr_curtrn->current;
112                return(CUR);
113        } else if (*cp==':' || *cp=='+' || *cp=='-') {
114                return(*cp++);
115        } else if (match(cp, "current")) {
116                cp += 7;
117                yylval=trnexpr_curtrn->current;
118                return(CUR);
119        } else if (match(cp, "new")) {
120                cp += 3;
121                return(NEW);
122        } else if (match(cp, "all")) {
123                cp += 3;
124                return(ALL);
125        } else if (match(cp, "aref")) {
126                cp += 4;
127                return(AREF);
128        } else if (match(cp, "next")) {
129                cp += 4;
130                yylval=trnexpr_curtrn->next;
131                return(NEXT);
132        } else if (match(cp, "prev")) {
133                cp += 4;
134                yylval=trnexpr_curtrn->prev;
135                return(PREV);
136        } else if (match(cp, "back")) {
137                cp += 4;
138                yylval=trnexpr_curtrn->prev;
139                return(PREV);
140        } else if (match(cp, "nref")) {
141                cp += 4;
142                yylval=trnexpr_curtrn->nref;
143                return(NREF);
144        } else if (match(cp, "pref")) {
145                cp += 4;
146                yylval=trnexpr_curtrn->pref;
147                return(PREF);
148        } else if (match(cp, "first")) {
149                cp += 5;
150                yylval=trnexpr_curmtg->first;
151                return(FIRST);
152        } else if (match(cp, "last")) {
153                cp += 4;
154                yylval=trnexpr_curmtg->last;
155                return(LAST);
156        } else if (match(cp, "fref")) {
157                cp += 4;
158                yylval=trnexpr_curtrn->fref;
159                return(FREF);
160        } else if (match(cp, "lref")) {
161                cp += 4;
162                yylval=trnexpr_curtrn->lref;
163                return(LREF);
164        } else if (match(cp, "n")) {
165                cp += 1;
166                yylval=trnexpr_curtrn->next;
167                return(NEXT);
168        } else if (match(cp, "b") || match(cp, "p")) {
169                cp += 1;
170                yylval=trnexpr_curtrn->prev;
171                return(PREV);
172        } else if (*cp=='l' || *cp=='L') {
173                cp++;
174                yylval=trnexpr_curmtg->last;
175                return(LAST);
176        } else if (*cp=='f' || *cp == 'F') {
177                cp++;
178                yylval=trnexpr_curmtg->first;
179                return(FIRST);
180        } else return (*cp++);
181}
182
183int trnexpr_parse(mtg, trn, string, lorange, highrange, flags)
184        mtg_info *mtg;
185        trn_info *trn;
186        char *string;
187        int *lorange, *highrange, *flags;
188{
189        cp = string;
190        trnexpr_curmtg = mtg;
191        trnexpr_curtrn = trn;
192        trnexpr_aref = 0;
193        trnexpr_err = 0;
194        (void) yyparse();
195        if(lorange)
196                *lorange = trnexpr_low;
197        if(highrange)
198                *highrange = trnexpr_high;
199        if(flags)
200                *flags = (trnexpr_aref) ? flag_AREF : 0;
201        return(trnexpr_err);
202}
203
204#ifdef notdef
205mtg_info mtg = { 0, "/tmp/foo", "bar", "quux", 1, 30, 22, 23, 1 };
206trn_info trn = { 0, 7, 6, 8, 5, 9, 2, 17, 3, 42, 7, 48, "Qux", "me" };
207main(argc, argv)
208        int argc;
209        char **argv;
210{
211        int low, high;
212        argv++; argc--;
213        while(argc--) {
214                low = -1; high = -1;
215                trnexpr_parse(&mtg, &trn, *argv, &low, &high);
216                printf("%s: %d:%d\n", *argv, low, high);
217                if(trnexpr_err) {
218                        printf("Error %d\n", trnexpr_err);
219                        trnexpr_err=0;
220                }
221                argv++;
222        }
223}
224#endif /* notdef */
Note: See TracBrowser for help on using the repository browser.