00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 # include "lclintMacros.nf"
00046 # include "llbasic.h"
00047
00048
00049 extern bool g_inTypeDef;
00050
00051
00052
00053 # include "llgrammar2.h"
00054
00055
00056 # include "lclscan.h"
00057 # include "scanline.h"
00058 # include "lclscanline.h"
00059 # include "lcltokentable.h"
00060
00061 static tsource *scanFile;
00062 static o_ltoken TokenList[MAXLINE];
00063 static bool restore = FALSE;
00064 static YYSTYPE restoretok;
00065 static int nextToken;
00066 static int lastToken;
00067
00068 static char *line;
00069 static unsigned int lineNumber;
00070
00071 ltokenCode yllex (void)
00072
00073 {
00074 lsymbol tokenSym;
00075
00076 if (restore)
00077 {
00078 yllval = restoretok;
00079 restore = FALSE;
00080 }
00081 else
00082 {
00083 yllval.ltok = ltoken_copy (LCLScanNextToken ());
00084 }
00085
00086 tokenSym = ltoken_getText (yllval.ltok);
00087
00088 if (ltoken_getCode (yllval.ltok) == simpleId)
00089 {
00090 if (g_inTypeDef)
00091 {
00092 ltoken_setCode (yllval.ltok, LLT_TYPEDEF_NAME);
00093 LCLUpdateToken (LLT_TYPEDEF_NAME, tokenSym,
00094 ltoken_isStateDefined (yllval.ltok));
00095 }
00096 else
00097 {
00098
00099
00100 if (symtable_exists (g_symtab, tokenSym))
00101 {
00102 if (typeInfo_exists (symtable_typeInfo (g_symtab, tokenSym)))
00103 {
00104 ltoken_setCode (yllval.ltok, LLT_TYPEDEF_NAME);
00105 LCLUpdateToken (LLT_TYPEDEF_NAME, tokenSym,
00106 ltoken_isStateDefined (yllval.ltok));
00107 }
00108 }
00109 }
00110 }
00111
00112 return (ltoken_getCode (yllval.ltok));
00113 }
00114
00115
00116
00117 ltoken
00118 LCLScanNextToken (void)
00119 {
00120 ltoken ret;
00121
00122 if (nextToken < lastToken)
00123 {
00124 ret = TokenList[nextToken++];
00125 }
00126 else
00127 {
00128 lastToken = 0;
00129 lineNumber++;
00130 line = tsource_nextLine (scanFile);
00131
00132 if (line != (char *) 0)
00133 {
00134
00135 LCLScanLine (line);
00136 nextToken = 0;
00137 ret = LCLScanNextToken ();
00138 return ret;
00139 }
00140 else
00141 {
00142 ret = LCLScanEofToken ();
00143 }
00144 }
00145
00146
00147 return ret;
00148 }
00149
00150 static ltoken
00151 LCLScanLookAhead (void)
00152 {
00153 if (nextToken < lastToken)
00154 {
00155 return TokenList[nextToken];
00156 }
00157 else
00158 {
00159 lastToken = 0;
00160 line = tsource_nextLine (scanFile);
00161 if (line != (char *) 0)
00162 {
00163 LCLScanLine (line);
00164 nextToken = 0;
00165 return LCLScanLookAhead ();
00166 }
00167 else
00168 {
00169 return LCLScanEofToken ();
00170 }
00171 }
00172 }
00173
00174 void
00175 LCLScanFreshToken ( ltoken tok)
00176 {
00177 if (lastToken < MAXLINE)
00178 {
00179 TokenList[lastToken++] = tok;
00180 }
00181 else
00182 {
00183 llbugexitlit ("LCLScanFreshToken: out of range");
00184 }
00185 }
00186
00187 tsource *LCLScanSource (void)
00188 {
00189 return scanFile;
00190 }
00191
00192
00193 void
00194 LCLScanInit (void)
00195 {
00196 }
00197
00198 void
00199 LCLScanReset (tsource * s)
00200 {
00201 scanFile = s;
00202 lastToken = 0;
00203 nextToken = lastToken + 1;
00204 lineNumber = 0;
00205 }
00206
00207 void
00208 LCLScanCleanup (void)
00209 {
00210 }
00211
00212