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