1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Scanner2 - some more minor fixes. I'm getting close to the trilogy...

This commit is contained in:
Doug Schaefer 2004-06-22 21:03:53 +00:00
parent d75195c520
commit 112cf2a908
2 changed files with 55 additions and 19 deletions

View file

@ -1668,4 +1668,12 @@ public class Scanner2Test extends BaseScanner2Test
validateIdentifier("hithere"); validateIdentifier("hithere");
validateEOF(); validateEOF();
} }
public void testSlashes() throws Exception {
initializeScanner("__q / __n");
validateIdentifier("__q");
validateToken(IToken.tDIV);
validateIdentifier("__n");
validateEOF();
}
} }

View file

@ -10,6 +10,9 @@
******************************************************************************/ ******************************************************************************/
package org.eclipse.cdt.internal.core.parser.scanner2; package org.eclipse.cdt.internal.core.parser.scanner2;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -71,6 +74,14 @@ public class Scanner2 implements IScanner, IScannerData {
private static char[] emptyCharArray = new char[0]; private static char[] emptyCharArray = new char[0];
private static EndOfFileException EOF = new EndOfFileException(); private static EndOfFileException EOF = new EndOfFileException();
PrintStream dlog;
{
try {
dlog = new PrintStream(new FileOutputStream("C:/dlog.txt"));
} catch (FileNotFoundException e) {
}
}
public Scanner2(CodeReader reader, public Scanner2(CodeReader reader,
IScannerInfo info, IScannerInfo info,
ISourceElementRequestor requestor, ISourceElementRequestor requestor,
@ -954,10 +965,10 @@ public class Scanner2 implements IScanner, IScannerData {
skipToNewLine(); skipToNewLine();
len = bufferPos[bufferStackPos] - start; len = bufferPos[bufferStackPos] - start;
if (expressionEvaluator.evaluate(buffer, start, len, definitions) == 0) { if (expressionEvaluator.evaluate(buffer, start, len, definitions) == 0) {
//System.out.println("#if <FALSE> " + new String(buffer,start+1,len-1)); dlog.println("#if <FALSE> " + new String(buffer,start+1,len-1));
skipOverConditionalCode(true); skipOverConditionalCode(true);
} //else } else
//System.out.println("#if <TRUE> " + new String(buffer,start+1,len-1)); dlog.println("#if <TRUE> " + new String(buffer,start+1,len-1));
return; return;
case ppElse: case ppElse:
case ppElif: case ppElif:
@ -1027,7 +1038,7 @@ public class Scanner2 implements IScanner, IScannerData {
CodeReader reader = null; CodeReader reader = null;
if (local) { if (local) {
// TODO obviously...
} }
// iterate through the include paths // iterate through the include paths
@ -1044,17 +1055,17 @@ public class Scanner2 implements IScanner, IScannerData {
} }
} else { } else {
reader = (CodeReader)fileCache.get(finalPath); reader = (CodeReader)fileCache.get(finalPath);
if (reader == null) { if (reader == null)
reader = ScannerUtility.createReaderDuple( finalPath, requestor, getWorkingCopies() ); reader = ScannerUtility.createReaderDuple( finalPath, requestor, getWorkingCopies() );
if (reader != null) { if (reader != null) {
if (reader.filename != null) if (reader.filename != null)
fileCache.put(reader.filename, reader); fileCache.put(reader.filename, reader);
dlog.println("#include <" + finalPath + ">");
pushContext(reader.buffer, reader); pushContext(reader.buffer, reader);
return; return;
} }
} }
} }
}
// TODO raise a problem // TODO raise a problem
//if (reader == null) //if (reader == null)
@ -1093,7 +1104,7 @@ public class Scanner2 implements IScanner, IScannerData {
--bufferPos[bufferStackPos]; --bufferPos[bufferStackPos];
char[] name = new char[idlen]; char[] name = new char[idlen];
System.arraycopy(buffer, idstart, name, 0, idlen); System.arraycopy(buffer, idstart, name, 0, idlen);
//System.out.println("#define " + new String(buffer, idstart, idlen)); dlog.println("#define " + new String(buffer, idstart, idlen));
// Now check for function style macro to store the arguments // Now check for function style macro to store the arguments
char[][] arglist = null; char[][] arglist = null;
@ -1103,6 +1114,7 @@ public class Scanner2 implements IScanner, IScannerData {
arglist = new char[4][]; arglist = new char[4][];
int currarg = -1; int currarg = -1;
while (bufferPos[bufferStackPos] < limit) { while (bufferPos[bufferStackPos] < limit) {
pos = bufferPos[bufferStackPos];
skipOverWhiteSpace(); skipOverWhiteSpace();
if (++bufferPos[bufferStackPos] >= limit) if (++bufferPos[bufferStackPos] >= limit)
return; return;
@ -1111,6 +1123,14 @@ public class Scanner2 implements IScanner, IScannerData {
break; break;
} else if (c == ',') { } else if (c == ',') {
continue; continue;
} else if (c == '.'
&& pos + 1 < limit && buffer[pos + 1] == '.'
&& pos + 2 < limit && buffer[pos + 2] == '.') {
// varargs
// TODO - something better
bufferPos[bufferStackPos] += 2;
arglist[++currarg] = "...".toCharArray();
continue;
} else if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')) { } else if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')) {
// yuck // yuck
skipToNewLine(); skipToNewLine();
@ -1189,6 +1209,7 @@ public class Scanner2 implements IScanner, IScannerData {
skipToNewLine(); skipToNewLine();
definitions.remove(buffer, idstart, idlen); definitions.remove(buffer, idstart, idlen);
dlog.println("#undef " + new String(buffer, idstart, idlen));
} }
private void handlePPIfdef(boolean positive) { private void handlePPIfdef(boolean positive) {
@ -1224,14 +1245,14 @@ public class Scanner2 implements IScanner, IScannerData {
skipToNewLine(); skipToNewLine();
if ((definitions.get(buffer, idstart, idlen) != null) == positive) { if ((definitions.get(buffer, idstart, idlen) != null) == positive) {
//System.out.println((positive ? "#ifdef" : "#ifndef") dlog.println((positive ? "#ifdef" : "#ifndef")
// + " <TRUE> " + new String(buffer, idstart, idlen)); + " <TRUE> " + new String(buffer, idstart, idlen));
// continue on // continue on
return; return;
} }
//System.out.println((positive ? "#ifdef" : "#ifndef") dlog.println((positive ? "#ifdef" : "#ifndef")
// + " <FALSE> " + new String(buffer, idstart, idlen)); + " <FALSE> " + new String(buffer, idstart, idlen));
// skip over this group // skip over this group
skipOverConditionalCode(true); skipOverConditionalCode(true);
} }
@ -1344,15 +1365,17 @@ public class Scanner2 implements IScanner, IScannerData {
break; break;
} }
} }
}
}
continue; continue;
}
}
break;
case '\\': case '\\':
if (pos + 1 < limit && buffer[pos + 1] == '\n') { if (pos + 1 < limit && buffer[pos + 1] == '\n') {
// \n is a whitespace // \n is a whitespace
++bufferPos[bufferStackPos]; ++bufferPos[bufferStackPos];
continue; continue;
} }
break;
} }
// fell out of switch without continuing, we're done // fell out of switch without continuing, we're done
@ -1418,6 +1441,8 @@ public class Scanner2 implements IScanner, IScannerData {
case ',': case ',':
case ')': case ')':
case '(': case '(':
case '<':
case '>':
--bufferPos[bufferStackPos]; --bufferPos[bufferStackPos];
return; return;
case '\\': case '\\':
@ -1558,13 +1583,16 @@ public class Scanner2 implements IScanner, IScannerData {
if (++bufferPos[bufferStackPos] >= limit) if (++bufferPos[bufferStackPos] >= limit)
break; break;
c = buffer[bufferPos[bufferStackPos]]; c = buffer[bufferPos[bufferStackPos]];
if (c == '(') if (c == '(' || c == '<')
++argparens; ++argparens;
else if (c == '>')
--argparens;
else if (c == ')') { else if (c == ')') {
if (argparens == 0) if (argparens == 0)
break; break;
--argparens; --argparens;
} else if (c == ',') } else if (c == ',')
if (argparens == 0)
break; break;
} }