1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00

Scanner2 - added char literals and string concatenation.

This commit is contained in:
Doug Schaefer 2004-06-16 17:42:35 +00:00
parent 4d440deec4
commit ed0afd6243
2 changed files with 54 additions and 16 deletions

View file

@ -203,8 +203,6 @@ public class BaseScanner2Test extends TestCase {
public void validateDefinition(String name, String value)
{
Object expObject = scanner.getRealDefinitions().get(name.toCharArray());
if (expObject == null)
System.out.println("Hi");
assertNotNull(expObject);
assertTrue(expObject instanceof ObjectStyleMacro);
assertTrue(CharArrayUtils.equals(value.toCharArray(), ((ObjectStyleMacro)expObject).expansion));

View file

@ -245,6 +245,14 @@ public class Scanner2 implements IScanner, IScannerData {
nextToken = null;
return nextToken();
}
} else if (token.getType() == IToken.tSTRING) {
while (nextToken != null && nextToken.getType() == IToken.tSTRING) {
// Concatenate the adjacent strings
String t1 = token.getImage();
String t2 = nextToken.getImage();
token = new ImagedToken(IToken.tSTRING, t1 + t2);
nextToken = fetchToken();
}
}
// TODO Check if token is ## and proceed with pasting
@ -286,6 +294,9 @@ public class Scanner2 implements IScanner, IScannerData {
case '"':
return scanString();
case '\'':
return scanCharLiteral();
case 'a':
case 'b':
@ -660,22 +671,19 @@ public class Scanner2 implements IScanner, IScannerData {
boolean escaped = false;
loop:
while (++bufferPos[bufferStackPos] < bufferLimit[bufferStackPos]) {
switch (buffer[bufferPos[bufferStackPos]]) {
case '\\':
++stringLen;
escaped = !escaped;
continue;
case '"':
if (escaped) {
escaped = false;
continue;
}
break loop;
default:
++stringLen;
escaped = false;
++stringLen;
char c = buffer[bufferPos[bufferStackPos]];
if (c == '"') {
if (!escaped)
break;
}
else if (c == '\\') {
escaped = !escaped;
continue;
}
escaped = false;
}
--stringLen;
// We should really throw an exception if we didn't get the terminating
// quote before the end of buffer
@ -683,6 +691,38 @@ public class Scanner2 implements IScanner, IScannerData {
return new ImagedToken(tokenType, new String(buffer, stringStart, stringLen));
}
private IToken scanCharLiteral() {
char[] buffer = bufferStack[bufferStackPos];
int start = bufferPos[bufferStackPos] + 1;
int limit = bufferLimit[bufferStackPos];
if (start >= limit) {
return new ImagedToken(IToken.tCHAR, new String(emptyCharArray));
}
int length = 0;
boolean escaped = false;
while (++bufferPos[bufferStackPos] < limit) {
++length;
int pos = bufferPos[bufferStackPos];
if (buffer[pos] == '\'') {
if (!escaped)
break;
} else if (buffer[pos] == '\\') {
escaped = !escaped;
continue;
}
escaped = false;
}
--length;
char[] image = length > 0
? CharArrayUtils.extract(buffer, start, length)
: emptyCharArray;
return new ImagedToken(IToken.tCHAR, new String(image));
}
private IToken scanNumber() {
char[] buffer = bufferStack[bufferStackPos];
int start = bufferPos[bufferStackPos];