1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 01:36:01 +02:00

Optional support for block-comments like /% comment %/, bug 130235.

This commit is contained in:
Markus Schorn 2008-08-01 09:37:20 +00:00
parent 4790fbf198
commit c4f2d97cf1
6 changed files with 87 additions and 18 deletions

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
@ -47,6 +48,7 @@ public class LanguageExtensionsTest extends AST2BaseTest {
protected static final int SIZEOF_EXTENSION = 0x1; protected static final int SIZEOF_EXTENSION = 0x1;
protected static final int FUNCTION_STYLE_ASM = 0x2; protected static final int FUNCTION_STYLE_ASM = 0x2;
protected static final int SLASH_PERCENT_COMMENT = 0x4;
public static TestSuite suite() { public static TestSuite suite() {
return suite(LanguageExtensionsTest.class); return suite(LanguageExtensionsTest.class);
@ -87,7 +89,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
} }
protected IASTTranslationUnit parseCPPWithExtension(String code, final int extensions) throws Exception { protected IASTTranslationUnit parseCPPWithExtension(String code, final int extensions) throws Exception {
return parse(code, GPPScannerExtensionConfiguration.getInstance(), return parse(code,
new GPPScannerExtensionConfiguration() {
@Override
public boolean supportSlashPercentComments() {
return (extensions & SLASH_PERCENT_COMMENT) != 0;
}
},
new GPPParserExtensionConfiguration() { new GPPParserExtensionConfiguration() {
@Override @Override
public boolean supportExtendedSizeofOperator() { public boolean supportExtendedSizeofOperator() {
@ -102,7 +110,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
} }
protected IASTTranslationUnit parseCWithExtension(String code, final int extensions) throws Exception { protected IASTTranslationUnit parseCWithExtension(String code, final int extensions) throws Exception {
return parse(code, GCCScannerExtensionConfiguration.getInstance(), return parse(code,
new GCCScannerExtensionConfiguration() {
@Override
public boolean supportSlashPercentComments() {
return (extensions & SLASH_PERCENT_COMMENT) != 0;
}
},
new GCCParserExtensionConfiguration() { new GCCParserExtensionConfiguration() {
@Override @Override
public boolean supportExtendedSizeofOperator() { public boolean supportExtendedSizeofOperator() {
@ -217,4 +231,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
fdef= getDeclaration(tu, 2); fdef= getDeclaration(tu, 2);
fdef= getDeclaration(tu, 3); fdef= getDeclaration(tu, 3);
} }
// /% a comment %/
// int a;
public void testSlashPercentComment() throws Exception {
IASTTranslationUnit tu= parseCWithExtension(getAboveComment(), SLASH_PERCENT_COMMENT);
IASTDeclaration d= getDeclaration(tu, 0);
assertEquals("int a;", d.getRawSignature());
}
} }

View file

@ -23,6 +23,16 @@ import org.eclipse.cdt.internal.core.parser.scanner.Lexer.LexerOptions;
public class LexerTests extends BaseTestCase { public class LexerTests extends BaseTestCase {
private static final LexerOptions DEFAULT_OPTIONS = new LexerOptions();
private static final LexerOptions NO_DOLLAR = new LexerOptions();
private static final LexerOptions NO_MINMAX = new LexerOptions();
private static final LexerOptions SLASH_PERCENT = new LexerOptions();
static {
NO_DOLLAR.fSupportDollarInIdentifiers= false;
NO_MINMAX.fSupportMinAndMax= false;
SLASH_PERCENT.fSupportSlashPercentComments= true;
}
static String TRIGRAPH_REPLACES_CHARS= "#^[]|{}~\\"; static String TRIGRAPH_REPLACES_CHARS= "#^[]|{}~\\";
static String TRIGRAPH_CHARS= "='()!<>-/"; static String TRIGRAPH_CHARS= "='()!<>-/";
@ -43,19 +53,13 @@ public class LexerTests extends BaseTestCase {
} }
private void init(String input) throws Exception { private void init(String input) throws Exception {
fLog.clear(); init(input, DEFAULT_OPTIONS);
fLexer= new Lexer(input.toCharArray(), new LexerOptions(), fLog, null);
fLog.setInput(input);
fLexer.nextToken();
fLastEndOffset= 0;
} }
private void init(String input, boolean dollar, boolean minmax) throws Exception { private void init(String input, LexerOptions options) throws Exception {
fLog.clear(); fLog.clear();
final LexerOptions lexerOptions = new LexerOptions(); fLexer= new Lexer(input.toCharArray(), options, fLog, null);
lexerOptions.fSupportDollarInIdentifiers= dollar; fLog.setInput(input);
lexerOptions.fSupportMinAndMax= minmax;
fLexer= new Lexer(input.toCharArray(), lexerOptions, fLog, null);
fLexer.nextToken(); fLexer.nextToken();
fLastEndOffset= 0; fLastEndOffset= 0;
} }
@ -278,6 +282,19 @@ public class LexerTests extends BaseTestCase {
eof(); eof();
} }
public void testSlashPercentComments() throws Exception {
init("// /%\na", SLASH_PERCENT);
comment("// /%");
nl();
id("a");
eof();
init("/% // /% \n xxx%/a", SLASH_PERCENT);
comment("/% // /% \n xxx%/");
id("a");
eof();
}
public void testMinimalComment() throws Exception { public void testMinimalComment() throws Exception {
init("a/**/b/**/"); init("a/**/b/**/");
id("a"); id("a");
@ -331,7 +348,7 @@ public class LexerTests extends BaseTestCase {
eof(); eof();
} }
init(ident, false, true); init(ident, NO_DOLLAR);
final int idxDollar = ident.indexOf('$'); final int idxDollar = ident.indexOf('$');
id(ident.substring(0, idxDollar)); id(ident.substring(0, idxDollar));
token(Lexer.tOTHER_CHARACTER, "$"); token(Lexer.tOTHER_CHARACTER, "$");
@ -470,7 +487,7 @@ public class LexerTests extends BaseTestCase {
eof(); eof();
assertEquals(ops, buf.toString()); // check token image assertEquals(ops, buf.toString()); // check token image
init(input, true, false); init(input, NO_MINMAX);
for (int i = 0; i < tokens.length; i++) { for (int i = 0; i < tokens.length; i++) {
switch (tokens[i]) { switch (tokens[i]) {
case IGCCToken.tMIN: case IGCCToken.tMIN:

View file

@ -62,6 +62,14 @@ public abstract class AbstractScannerExtensionConfiguration implements IScannerE
public boolean supportAtSignInIdentifiers() { public boolean supportAtSignInIdentifiers() {
return false; return false;
} }
/**
* {@inheritDoc}
* @since 5.1
*/
public boolean supportSlashPercentComments() {
return false;
}
/* /*
* @see org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration#supportAdditionalNumericLiteralSuffixes() * @see org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration#supportAdditionalNumericLiteralSuffixes()

View file

@ -48,6 +48,14 @@ public interface IScannerExtensionConfiguration {
*/ */
public boolean supportAtSignInIdentifiers(); public boolean supportAtSignInIdentifiers();
/**
* Support for block-comments comments using /% %/.
* @return <code>true</code>, if /% should be interpreted as the start of a block-comment which is
* ended by %/
* @since 5.1
*/
public boolean supportSlashPercentComments();
/** /**
* Support for (deprecated) GNU minimum and maximum operators (<code>&lt;?</code> * Support for (deprecated) GNU minimum and maximum operators (<code>&lt;?</code>
* and <code>&gt;?</code>). * and <code>&gt;?</code>).

View file

@ -150,6 +150,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
fLexOptions.fSupportDollarInIdentifiers= configuration.support$InIdentifiers(); fLexOptions.fSupportDollarInIdentifiers= configuration.support$InIdentifiers();
fLexOptions.fSupportAtSignInIdentifiers= configuration.supportAtSignInIdentifiers(); fLexOptions.fSupportAtSignInIdentifiers= configuration.supportAtSignInIdentifiers();
fLexOptions.fSupportMinAndMax = configuration.supportMinAndMaxOperators(); fLexOptions.fSupportMinAndMax = configuration.supportMinAndMaxOperators();
fLexOptions.fSupportSlashPercentComments= configuration.supportSlashPercentComments();
fKeywords= new CharArrayIntMap(40, -1); fKeywords= new CharArrayIntMap(40, -1);
fPPKeywords= new CharArrayIntMap(40, -1); fPPKeywords= new CharArrayIntMap(40, -1);
configureKeywords(language, configuration); configureKeywords(language, configuration);

View file

@ -50,6 +50,7 @@ final public class Lexer {
public boolean fSupportAtSignInIdentifiers= true; public boolean fSupportAtSignInIdentifiers= true;
public boolean fSupportMinAndMax= true; public boolean fSupportMinAndMax= true;
public boolean fCreateImageLocations= true; public boolean fCreateImageLocations= true;
public boolean fSupportSlashPercentComments= false;
@Override @Override
public Object clone() { public Object clone() {
@ -267,7 +268,12 @@ final public class Lexer {
lineComment(start); lineComment(start);
continue; continue;
case '*': case '*':
blockComment(start); blockComment(start, '*');
continue;
case '%':
if (fOptions.fSupportSlashPercentComments) {
blockComment(start, '%');
}
continue; continue;
} }
continue; continue;
@ -485,8 +491,14 @@ final public class Lexer {
lineComment(start); lineComment(start);
continue; continue;
case '*': case '*':
blockComment(start); blockComment(start, '*');
continue; continue;
case '%':
if (fOptions.fSupportSlashPercentComments) {
blockComment(start, '%');
continue;
}
break;
} }
return newToken(IToken.tDIV, start); return newToken(IToken.tDIV, start);
@ -681,11 +693,11 @@ final public class Lexer {
return newToken((expectQuotes ? tQUOTE_HEADER_NAME : tSYSTEM_HEADER_NAME), start, length); return newToken((expectQuotes ? tQUOTE_HEADER_NAME : tSYSTEM_HEADER_NAME), start, length);
} }
private void blockComment(final int start) { private void blockComment(final int start, final char trigger) {
// we can ignore line-splices, trigraphs and windows newlines when searching for the '*' // we can ignore line-splices, trigraphs and windows newlines when searching for the '*'
int pos= fEndOffset; int pos= fEndOffset;
while(pos < fLimit) { while(pos < fLimit) {
if (fInput[pos++] == '*') { if (fInput[pos++] == trigger) {
fEndOffset= pos; fEndOffset= pos;
if (nextCharPhase3() == '/') { if (nextCharPhase3() == '/') {
nextCharPhase3(); nextCharPhase3();