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