]>
Commit | Line | Data |
---|---|---|
885824d3 | 1 | /* |
28bf4b0b | 2 | ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001. |
885824d3 | 3 | ** See ../LICENSE for license information. |
4 | ** | |
5 | */ | |
6 | /* | |
7 | ** ltoken.h | |
8 | */ | |
9 | ||
10 | # ifdef NOLCL | |
11 | # error "Bad include" | |
12 | # endif | |
13 | ||
14 | # ifndef LTOKEN_H | |
15 | # define LTOKEN_H | |
16 | ||
17 | /* SimpleId codes */ | |
18 | typedef enum { | |
19 | SID_VAR, /* VarId */ | |
20 | SID_TYPE, /* TypeId */ | |
21 | SID_OP, /* OpId */ | |
22 | SID_SORT /* sortId */ | |
23 | } SimpleIdCode; | |
24 | ||
28bf4b0b | 25 | struct s_ltoken { |
26 | ltokenCode code; | |
27 | int col; | |
28 | int line; | |
29 | ||
30 | /* if idtype is SID_SORT, then text field keeps the sort */ | |
31 | lsymbol text; /* string handle */ | |
32 | lsymbol fname; /* source handle */ | |
33 | lsymbol rawText; /* original text */ | |
34 | bool defined: 1; /* token predefined */ | |
35 | bool hasSyn: 1; /* synonym exists */ | |
36 | ||
37 | /* just for simpleId: for distinguish simpleId into varId, fcnId, TypeId, ... */ | |
38 | /*@reldef@*/ SimpleIdCode idtype; | |
39 | ||
40 | /* quick and dirty: just for ctypes */ | |
41 | /*@reldef@*/ unsigned int intfield; | |
885824d3 | 42 | } ; |
43 | ||
44 | typedef /*@only@*/ ltoken o_ltoken; | |
45 | ||
46 | /*@constant null ltoken ltoken_undefined; @*/ | |
47 | # define ltoken_undefined ((ltoken)NULL) | |
48 | ||
49 | extern /*@falsenull@*/ bool ltoken_isValid (ltoken p_tok); | |
50 | # define ltoken_isValid(t) ((t) != ltoken_undefined) | |
51 | ||
52 | extern /*@truenull@*/ bool ltoken_isUndefined (ltoken p_tok); | |
53 | # define ltoken_isUndefined(t) ((t) == ltoken_undefined) | |
54 | ||
55 | extern bool ltoken_isStateDefined (/*@sef@*/ ltoken p_tok) /*@*/ ; | |
56 | # define ltoken_isStateDefined(t) \ | |
57 | (ltoken_isValid (t) && (t)->defined) | |
58 | ||
59 | extern void ltoken_setDefined (/*@sef@*/ ltoken p_tok, bool p_def); | |
60 | # define ltoken_setDefined(t, def) \ | |
61 | (ltoken_isValid (t) ? (t)->defined = (def) : (def)) | |
62 | ||
63 | extern ltoken | |
28bf4b0b | 64 | ltoken_createType (ltokenCode p_code, SimpleIdCode p_idtype, lsymbol p_text) /*@*/ ; |
885824d3 | 65 | |
28bf4b0b | 66 | extern ltoken ltoken_create (ltokenCode p_code, lsymbol p_text) /*@*/ ; |
885824d3 | 67 | |
68 | extern void ltoken_setIntField (/*@sef@*/ ltoken p_tok, unsigned int p_i); | |
69 | # define ltoken_setIntField(tok,i) \ | |
70 | (ltoken_isValid (tok) ? (tok)->intfield = (i) : (i)) | |
71 | ||
28bf4b0b | 72 | extern int ltoken_getLine (/*@sef@*/ ltoken p_tok); |
885824d3 | 73 | # define ltoken_getLine(tok) \ |
74 | (ltoken_isValid (tok) ? (tok)->line : 0) | |
75 | ||
28bf4b0b | 76 | extern void ltoken_setLine (/*@sef@*/ ltoken p_tok, /*@sef@*/ int p_line); |
885824d3 | 77 | # define ltoken_setLine(tok, ln) \ |
2934b455 | 78 | (ltoken_isValid (tok) ? (tok)->line = (ln) : 0) |
885824d3 | 79 | |
28bf4b0b | 80 | extern int ltoken_getCol (/*@sef@*/ ltoken p_tok); |
885824d3 | 81 | # define ltoken_getCol(tok) \ |
82 | (ltoken_isValid (tok) ? (tok)->col : 0) | |
83 | ||
28bf4b0b | 84 | extern void ltoken_setCol (/*@sef@*/ ltoken p_tok, int p_col) |
885824d3 | 85 | /*@modifies p_tok@*/ ; |
86 | # define ltoken_setCol(tok, c) \ | |
87 | (ltoken_isValid (tok) ? (tok)->col = (c) : (c)) | |
88 | ||
28bf4b0b | 89 | extern ltokenCode ltoken_getCode (/*@sef@*/ ltoken p_tok) /*@*/ ; |
885824d3 | 90 | # define ltoken_getCode(tok) \ |
91 | (ltoken_isValid (tok) ? (tok)->code : NOTTOKEN) | |
92 | ||
93 | extern unsigned int ltoken_getIntField (/*@sef@*/ ltoken p_tok) /*@*/ ; | |
94 | # define ltoken_getIntField(tok) \ | |
95 | (ltoken_isValid (tok) ? (tok)->intfield : 0) | |
96 | ||
97 | extern lsymbol ltoken_getText (/*@sef@*/ ltoken p_tok) /*@*/; | |
98 | # define ltoken_getText(tok) \ | |
99 | (ltoken_isValid (tok) ? (tok)->text : lsymbol_undefined) | |
100 | ||
101 | extern /*@exposed@*/ char *ltoken_getTextChars (/*@sef@*/ ltoken p_tok) /*@*/ ; | |
102 | # define ltoken_getTextChars(tok) \ | |
103 | (lsymbol_toCharsSafe (ltoken_getText (tok))) | |
104 | ||
105 | extern bool ltoken_hasSyn (/*@sef@*/ ltoken p_tok) /*@*/ ; | |
106 | # define ltoken_hasSyn(tok) \ | |
107 | (ltoken_isValid (tok) ? (tok)->hasSyn : FALSE) | |
108 | ||
109 | ||
110 | extern bool ltoken_wasSyn (/*@sef@*/ ltoken p_tok); | |
111 | # define ltoken_wasSyn(tok) \ | |
112 | (ltoken_isValid (tok) ? lsymbol_isDefined ((tok)->rawText) : FALSE) | |
113 | ||
114 | /*@-namechecks@*/ | |
115 | extern /*@dependent@*/ ltoken ltoken_forall; | |
116 | extern /*@dependent@*/ ltoken ltoken_exists; | |
117 | extern /*@dependent@*/ ltoken ltoken_true; | |
118 | extern /*@dependent@*/ ltoken ltoken_false; | |
119 | extern /*@dependent@*/ ltoken ltoken_not; | |
120 | extern /*@dependent@*/ ltoken ltoken_and; | |
121 | extern /*@dependent@*/ ltoken ltoken_or; | |
122 | extern /*@dependent@*/ ltoken ltoken_implies; | |
123 | extern /*@dependent@*/ ltoken ltoken_eq; | |
124 | extern /*@dependent@*/ ltoken ltoken_neq; | |
125 | extern /*@dependent@*/ ltoken ltoken_equals; | |
126 | extern /*@dependent@*/ ltoken ltoken_eqsep; | |
127 | extern /*@dependent@*/ ltoken ltoken_select; | |
128 | extern /*@dependent@*/ ltoken ltoken_open; | |
129 | extern /*@dependent@*/ ltoken ltoken_sep; | |
130 | extern /*@dependent@*/ ltoken ltoken_close; | |
131 | extern /*@dependent@*/ ltoken ltoken_id; | |
132 | extern /*@dependent@*/ ltoken ltoken_arrow; | |
133 | extern /*@dependent@*/ ltoken ltoken_marker; | |
134 | extern /*@dependent@*/ ltoken ltoken_pre; | |
135 | extern /*@dependent@*/ ltoken ltoken_post; | |
136 | extern /*@dependent@*/ ltoken ltoken_comment; | |
137 | extern /*@dependent@*/ ltoken ltoken_compose; | |
138 | extern /*@dependent@*/ ltoken ltoken_if; | |
139 | extern /*@dependent@*/ ltoken ltoken_any; | |
140 | extern /*@dependent@*/ ltoken ltoken_result; | |
141 | extern /*@dependent@*/ ltoken ltoken_typename; | |
142 | extern /*@dependent@*/ ltoken ltoken_bool; | |
143 | extern /*@dependent@*/ ltoken ltoken_farrow; | |
144 | extern /*@dependent@*/ ltoken ltoken_lbracked; | |
145 | extern /*@dependent@*/ ltoken ltoken_rbracket; | |
146 | /*@=namechecks@*/ | |
147 | ||
148 | extern cstring ltoken_unparseCodeName (ltoken p_tok) /*@*/ ; | |
149 | ||
150 | extern /*@observer@*/ cstring ltoken_unparse (ltoken p_s); | |
151 | ||
28bf4b0b | 152 | extern void ltoken_setCode (/*@sef@*/ ltoken p_s, ltokenCode p_code); |
885824d3 | 153 | # define ltoken_setCode(s,c) (ltoken_isValid (s) ? (s)->code = (c) : (c)) |
154 | ||
155 | extern void ltoken_setRawText (/*@sef@*/ ltoken p_s, lsymbol p_t); | |
156 | # define ltoken_setRawText(s,t) (ltoken_isValid (s) ? (s)->rawText = (t) : (t)) | |
157 | ||
158 | extern void ltoken_setIdType (/*@sef@*/ ltoken p_s, SimpleIdCode p_idtype); | |
159 | # define ltoken_setIdType(s,i) (ltoken_isValid (s) ? (s)->idtype = (i) : (i)) | |
160 | ||
161 | extern void ltoken_setText (/*@sef@*/ ltoken p_s, lsymbol p_text); | |
162 | # define ltoken_setText(s,t) (ltoken_isValid (s) ? (s)->text = (t) : (t)) | |
163 | ||
164 | extern lsymbol ltoken_getRawText (ltoken) /*@*/ ; | |
165 | ||
166 | /* defined in abstract.c */ | |
167 | extern bool ltoken_similar (ltoken p_t1, ltoken p_t2) /*@*/ ; | |
168 | ||
169 | extern /*@observer@*/ char *ltoken_getRawTextChars (ltoken p_s) /*@*/ ; | |
170 | # define ltoken_getRawTextChars(s) \ | |
171 | (lsymbol_toCharsSafe (ltoken_getRawText (s))) | |
172 | ||
173 | extern /*@observer@*/ cstring ltoken_getRawString (ltoken p_s) /*@*/ ; | |
174 | # define ltoken_getRawString(s) \ | |
175 | (lsymbol_toString (ltoken_getRawText (s))) | |
176 | ||
177 | extern ltoken ltoken_copy (ltoken) /*@*/ ; | |
178 | ||
179 | extern /*@observer@*/ cstring ltoken_fileName (/*@sef@*/ ltoken p_s); | |
180 | # define ltoken_fileName(s) \ | |
181 | (ltoken_isValid(s) ? lsymbol_toString ((s)->fname) : cstring_undefined) | |
182 | ||
28bf4b0b | 183 | extern void ltoken_setFileName (/*@sef@*/ ltoken p_tok, /*@sef@*/ cstring p_fname); |
885824d3 | 184 | # define ltoken_setFileName(tok,f) \ |
28bf4b0b | 185 | (ltoken_isValid(tok) ? (tok)->fname = lsymbol_fromString (f) : lsymbol_undefined) |
885824d3 | 186 | |
187 | extern bool ltoken_isChar (ltoken p_tok); | |
188 | # define ltoken_isChar(t) \ | |
189 | (cstring_length (ltoken_unparse (t)) == 1) | |
190 | ||
191 | extern void ltoken_setHasSyn (/*@sef@*/ ltoken p_tok, bool p_def); | |
192 | # define ltoken_setHasSyn(tok, def) \ | |
193 | (ltoken_isValid(tok) ? (tok)->hasSyn = (def) : (def)) | |
194 | ||
195 | extern void ltoken_free (/*@only@*/ ltoken); | |
196 | ||
28bf4b0b | 197 | extern ltoken ltoken_createFull (ltokenCode p_code, lsymbol p_text, |
198 | cstring p_file, int p_line, int p_col) /*@*/ ; | |
885824d3 | 199 | |
28bf4b0b | 200 | extern ltoken ltoken_createRaw (ltokenCode p_code, lsymbol p_text) /*@*/ ; |
885824d3 | 201 | extern cstring ltoken_unparseLoc (ltoken p_t) /*@*/ ; |
202 | ||
203 | extern void ltoken_markOwned (/*@owned@*/ ltoken); | |
204 | extern bool ltoken_isSingleChar (char) /*@*/ ; | |
205 | ||
206 | # else | |
207 | # error "Multiple include" | |
208 | # endif | |
209 | ||
210 | ||
211 | ||
212 | ||
213 |