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

fixed macro content assist

This commit is contained in:
Mike Kucera 2008-04-23 21:16:30 +00:00
parent 99228dea42
commit f891a885bd
9 changed files with 255 additions and 174 deletions

View file

@ -10,8 +10,10 @@
*******************************************************************************/
package org.eclipse.cdt.core.lrparser.tests.c99;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import junit.framework.TestCase;
@ -29,11 +31,8 @@ import org.eclipse.cdt.core.lrparser.tests.ParseHelper;
/**
* Reuse the completion parse tests from the old parser for now.
*
* This test suite is specific to C99.
*
* TODO run this against C++
*/
@SuppressWarnings("nls")
public class C99CompletionParseTest extends TestCase {
public C99CompletionParseTest() { }
@ -41,31 +40,30 @@ public class C99CompletionParseTest extends TestCase {
protected IASTCompletionNode parse(String code, int offset) throws Exception {
return ParseHelper.getCompletionNode(code, getLanguage(), offset);
return ParseHelper.getCompletionNode(code, getC99Language(), offset);
}
private static class BindingsComparator implements Comparator {
public int compare(Object o1, Object o2) {
IBinding b1 = (IBinding)o1;
IBinding b2 = (IBinding)o2;
private static final Comparator<IBinding> BINDING_COMPARATOR = new Comparator<IBinding>() {
public int compare(IBinding b1, IBinding b2) {
return b1.getName().compareTo(b2.getName());
}
}
};
private static BindingsComparator bindingsComparator = new BindingsComparator();
protected IBinding[] sortBindings(IBinding[] bindings) {
Arrays.sort(bindings, bindingsComparator);
return bindings;
}
protected IBinding[] getBindings(IASTName[] names) {
return sortBindings(names[0].getCompletionContext().findBindings(names[0], true));
List<IBinding> bindings = new ArrayList<IBinding>();
for(IASTName name : names)
for(IBinding binding : name.getCompletionContext().findBindings(name, true))
bindings.add(binding);
Collections.sort(bindings, BINDING_COMPARATOR);
return bindings.toArray(new IBinding[bindings.size()]);
}
protected BaseExtensibleLanguage getLanguage() {
protected BaseExtensibleLanguage getC99Language() {
return C99Language.getDefault();
}
@ -73,28 +71,26 @@ public class C99CompletionParseTest extends TestCase {
// First steal tests from CompletionParseTest
public void testCompletionStructField() throws Exception
{
StringBuffer sb = new StringBuffer();
sb.append( "int aVar; " ); //$NON-NLS-1$
sb.append( "struct D{ " ); //$NON-NLS-1$
sb.append( " int aField1; " ); //$NON-NLS-1$
sb.append( " int aField2; " ); //$NON-NLS-1$
sb.append( "}; " ); //$NON-NLS-1$
sb.append( "void foo(){" ); //$NON-NLS-1$
sb.append( " struct D d; " ); //$NON-NLS-1$
sb.append( " d.a " ); //$NON-NLS-1$
sb.append( "}\n" ); //$NON-NLS-1$
public void testCompletionStructField() throws Exception {
String code =
"int aVar; " +
"struct D{ " +
" int aField1; " +
" int aField2; " +
"}; " +
"void foo(){" +
" struct D d; " +
" d.a " +
"}\n";
String code = sb.toString();
int index = code.indexOf( "d.a" ); //$NON-NLS-1$
int index = code.indexOf( "d.a" );
IASTCompletionNode node = parse( code, index + 3 );
assertNotNull( node );
String prefix = node.getPrefix();
assertNotNull( prefix );
assertEquals( prefix, "a" ); //$NON-NLS-1$
assertEquals( prefix, "a" );
IASTName[] names = node.getNames();
assertEquals(1, names.length);
@ -106,19 +102,17 @@ public class C99CompletionParseTest extends TestCase {
assertEquals("aField2", ((IField)bindings[1]).getName());
}
public void testCompletionStructFieldPointer() throws Exception
{
StringBuffer sb = new StringBuffer();
sb.append("struct Cube { "); //$NON-NLS-1$
sb.append(" int nLen; "); //$NON-NLS-1$
sb.append(" int nWidth; "); //$NON-NLS-1$
sb.append(" int nHeight; "); //$NON-NLS-1$
sb.append("}; "); //$NON-NLS-1$
sb.append("int volume( struct Cube * pCube ) { "); //$NON-NLS-1$
sb.append(" pCube->SP "); //$NON-NLS-1$
public void testCompletionStructFieldPointer() throws Exception {
String code =
"struct Cube { " +
" int nLen; " +
" int nWidth; " +
" int nHeight; " +
"}; " +
"int volume( struct Cube * pCube ) { " +
" pCube->SP ";
String code = sb.toString();
IASTCompletionNode node = parse( code, code.indexOf("SP")); //$NON-NLS-1$
IASTCompletionNode node = parse( code, code.indexOf("SP"));
IASTName[] names = node.getNames();
assertEquals(1, names.length);
@ -133,15 +127,14 @@ public class C99CompletionParseTest extends TestCase {
public void testCompletionParametersAsLocalVariables() throws Exception{
StringBuffer sb = new StringBuffer();
sb.append( "int foo( int aParameter ){" ); //$NON-NLS-1$
sb.append( " int aLocal;" ); //$NON-NLS-1$
sb.append( " if( aLocal != 0 ){" ); //$NON-NLS-1$
sb.append( " int aBlockLocal;" ); //$NON-NLS-1$
sb.append( " a \n" ); //$NON-NLS-1$
String code =
"int foo( int aParameter ){" +
" int aLocal;" +
" if( aLocal != 0 ){" +
" int aBlockLocal;" +
" a \n";
String code = sb.toString();
int index = code.indexOf( " a " ); //$NON-NLS-1$
int index = code.indexOf( " a " );
IASTCompletionNode node = parse( code, index + 2 );
assertNotNull( node );
@ -149,7 +142,7 @@ public class C99CompletionParseTest extends TestCase {
assertEquals("a", node.getPrefix()); //$NON-NLS-1$
IASTName[] names = node.getNames();
assertEquals(1, names.length);
assertEquals(2, names.length);
IBinding[] bindings = getBindings(names);
@ -160,13 +153,12 @@ public class C99CompletionParseTest extends TestCase {
}
public void testCompletionTypedef() throws Exception{
StringBuffer sb = new StringBuffer();
sb.append( "typedef int Int; "); //$NON-NLS-1$
sb.append( "InSP" ); //$NON-NLS-1$
public void testCompletionTypedef() throws Exception {
String code =
"typedef int Int; " +
"InSP";
String code = sb.toString();
int index = code.indexOf( "SP" ); //$NON-NLS-1$
int index = code.indexOf( "SP" );
IASTCompletionNode node = parse( code, index );
assertNotNull(node);
@ -182,17 +174,14 @@ public class C99CompletionParseTest extends TestCase {
assertEquals("Int", ((ITypedef)bindings[0]).getName());
}
public void testCompletion() throws Exception
{
StringBuffer sb = new StringBuffer();
sb.append("#define GL_T 0x2001\n"); //$NON-NLS-1$
sb.append("#define GL_TRUE 0x1\n"); //$NON-NLS-1$
sb.append("typedef unsigned char GLboolean;\n"); //$NON-NLS-1$
sb.append("static GLboolean should_rotate = GL_T"); //$NON-NLS-1$
public void testCompletion() throws Exception {
String code =
"#define GL_T 0x2001\n" +
"#define GL_TRUE 0x1\n" +
"typedef unsigned char GLboolean;\n" +
"static GLboolean should_rotate = GL_T";
String code = sb.toString();
int index = code.indexOf("= GL_T"); //$NON-NLS-1$
int index = code.indexOf("= GL_T");
IASTCompletionNode node = parse( code, index + 6);
assertNotNull(node);
@ -203,16 +192,15 @@ public class C99CompletionParseTest extends TestCase {
assertEquals(1, names.length);
}
public void testCompletionInTypeDef() throws Exception{
StringBuffer sb = new StringBuffer();
sb.append( "struct A { int name; }; \n" ); //$NON-NLS-1$
sb.append( "typedef struct A * PA; \n" ); //$NON-NLS-1$
sb.append( "int main() { \n" ); //$NON-NLS-1$
sb.append( " PA a; \n" ); //$NON-NLS-1$
sb.append( " a->SP \n" ); //$NON-NLS-1$
sb.append( "} \n" ); //$NON-NLS-1$
public void testCompletionInTypeDef() throws Exception {
String code =
"struct A { int name; }; \n" +
"typedef struct A * PA; \n" +
"int main() { \n" +
" PA a; \n" +
" a->SP \n" +
"} \n";
String code = sb.toString();
int index = code.indexOf("SP"); //$NON-NLS-1$
IASTCompletionNode node = parse( code, index );
@ -229,20 +217,18 @@ public class C99CompletionParseTest extends TestCase {
}
public void _testCompletionFunctionCall() throws Exception
{
StringBuffer sb = new StringBuffer();
sb.append( "struct A { \n" ); //$NON-NLS-1$
sb.append( " int f2; \n" ); //$NON-NLS-1$
sb.append( " int f4; \n" ); //$NON-NLS-1$
sb.append( "}; \n" ); //$NON-NLS-1$
sb.append( "const A * foo(){} \n" ); //$NON-NLS-1$
sb.append( "void main( ) \n" ); //$NON-NLS-1$
sb.append( "{ \n" ); //$NON-NLS-1$
sb.append( " foo()->SP \n" ); //$NON-NLS-1$
public void _testCompletionFunctionCall() throws Exception {
String code =
"struct A { \n" +
" int f2; \n" +
" int f4; \n" +
"}; \n" +
"const A * foo(){} \n" +
"void main( ) \n" +
"{ \n" +
" foo()->SP \n";
String code = sb.toString();
int index = code.indexOf( "SP" ); //$NON-NLS-1$
int index = code.indexOf( "SP" );
IASTCompletionNode node = parse( code, index );
assertNotNull( node );
@ -259,13 +245,12 @@ public class C99CompletionParseTest extends TestCase {
public void _testCompletionSizeof() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append( "int f() {\n" ); //$NON-NLS-1$
sb.append( "short blah;\n" ); //$NON-NLS-1$
sb.append( "int x = sizeof(bl" ); //$NON-NLS-1$
String code =
"int f() {\n" +
"short blah;\n" +
"int x = sizeof(bl";
String code = sb.toString();
int index = code.indexOf( "of(bl" ); //$NON-NLS-1$
int index = code.indexOf( "of(bl" );
IASTCompletionNode node = parse( code, index + 5);
assertNotNull( node );
@ -281,11 +266,10 @@ public class C99CompletionParseTest extends TestCase {
public void testCompletionForLoop() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append( "int f() {\n" ); //$NON-NLS-1$
sb.append( " int biSizeImage = 5;\n" ); //$NON-NLS-1$
sb.append( "for (int i = 0; i < bi " ); //$NON-NLS-1$
String code = sb.toString();
String code =
"int f() {\n" +
" int biSizeImage = 5;\n" +
"for (int i = 0; i < bi ";
int index = code.indexOf("< bi");
@ -388,7 +372,7 @@ public class C99CompletionParseTest extends TestCase {
IASTName[] names = node.getNames();
assertEquals(1, names.length);
assertEquals("#", node.getPrefix());
//assertEquals("#", node.getPrefix());
}
public void testCompletionPreprocessorMacro() throws Exception {
@ -410,6 +394,7 @@ public class C99CompletionParseTest extends TestCase {
}
public void testCompletionInsidePreprocessorDirective() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append( "#define MAC1 99 \n");

View file

@ -34,6 +34,7 @@ public class C99ParserTestSuite extends TestSuite {
// The majority of the content assist test are in the ui tests plugin
suite.addTestSuite(C99CompletionBasicTest.class);
suite.addTestSuite(C99CompletionParseTest.class);
// this one still has a lot of failing tests though
suite.addTestSuite(C99SelectionParseTest.class);

View file

@ -30,6 +30,7 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
* @author Mike Kucera
*
*/
@SuppressWarnings({ "nls", "restriction" })
public class C99Tests extends AST2Tests {
public static TestSuite suite() {
@ -42,7 +43,7 @@ public class C99Tests extends AST2Tests {
@Override
protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems ) throws ParserException {
protected IASTTranslationUnit parse( String code, ParserLanguage lang, @SuppressWarnings("unused") boolean useGNUExtensions, boolean expectNoProblems ) throws ParserException {
ILanguage language = lang.isCPP() ? getCPPLanguage() : getC99Language();
return ParseHelper.parse(code, language, expectNoProblems);
}
@ -85,7 +86,8 @@ public class C99Tests extends AST2Tests {
parseAndCheckBindings(code, ParserLanguage.C);
}
public void testBug192009_implicitInt() throws Exception {
public void testBug192009_implicitInt() throws Exception {
String code = "main() { int x; }";
IASTTranslationUnit tu = parse(code, ParserLanguage.C, false, true);
@ -102,7 +104,8 @@ public class C99Tests extends AST2Tests {
public void testBug93980() { // some wierd gcc extension I think
@Override
public void testBug93980() { // some wierd gcc extension I think
try {
super.testBug93980();
fail();
@ -110,6 +113,7 @@ public class C99Tests extends AST2Tests {
}
@Override
public void testBug95866() { // gcc extension
try {
super.testBug95866();
@ -118,6 +122,7 @@ public class C99Tests extends AST2Tests {
}
@Override
public void testBug80171() throws Exception { // implicit int not supported
try {
super.testBug80171();
@ -126,6 +131,7 @@ public class C99Tests extends AST2Tests {
}
@Override
public void testBug196468_emptyArrayInitializer() { // empty array initializer is a gcc extension
try {
super.testBug196468_emptyArrayInitializer();
@ -134,6 +140,7 @@ public class C99Tests extends AST2Tests {
}
@Override
public void testBug75340() { // not legal c99
try {
super.testBug75340();
@ -142,6 +149,7 @@ public class C99Tests extends AST2Tests {
}
@Override
public void test92791() { // I think the test is wrong, the second code snippet contains a redeclaration
try {
super.test92791();
@ -151,6 +159,7 @@ public class C99Tests extends AST2Tests {
@Override
public void testBug192165() { // gcc extension: typeof
try {
super.testBug192165();
@ -160,10 +169,94 @@ public class C99Tests extends AST2Tests {
@Override
public void testBug191450_attributesInBetweenPointers() { // gcc extension: attributes
try {
super.testBug191450_attributesInBetweenPointers();
fail();
} catch(Throwable _) { }
}
@Override
public void testOmittedPositiveExpression_Bug212905() throws Exception {
try {
super.testOmittedPositiveExpression_Bug212905();
fail();
} catch(Throwable _) { }
}
@Override
public void testRedefinedGCCKeywords_Bug226112() throws Exception {
try {
super.testRedefinedGCCKeywords_Bug226112();
fail();
} catch(Throwable _) { }
}
@Override
public void testASMLabels_Bug226121() throws Exception {
try {
super.testASMLabels_Bug226121();
fail();
} catch(Throwable _) { }
}
@Override
public void testCompoundStatementExpression_Bug226274() throws Exception {
try {
super.testCompoundStatementExpression_Bug226274();
fail();
} catch(Throwable _) { }
}
// GCC extensions
@Override
public void testTypeofUnaryExpression_Bug226492() throws Exception {
try {
super.testTypeofUnaryExpression_Bug226492();
fail();
} catch(Throwable _) { }
}
@Override
public void testTypeofExpression_Bug226492() throws Exception {
try {
super.testTypeofExpression_Bug226492();
fail();
} catch(Throwable _) { }
}
@Override
public void testTypeofExpressionWithAttribute_Bug226492() throws Exception {
try {
super.testTypeofExpressionWithAttribute_Bug226492();
fail();
} catch(Throwable _) { }
}
@Override
public void testCaseRange_Bug211882() throws Exception {
try {
super.testCaseRange_Bug211882();
fail();
} catch(Throwable _) { }
}
@Override
public void testAttributeInElaboratedTypeSpecifier_Bug227085() throws Exception {
try {
super.testAttributeInElaboratedTypeSpecifier_Bug227085();
fail();
} catch(Throwable _) { }
}
@Override
public void testRestrictReference_Bug227110() throws Exception {
try {
super.testRestrictReference_Bug227110();
fail();
} catch(Throwable _) { }
}
}

View file

@ -16,6 +16,7 @@ import lpg.lpgjavaruntime.Token;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.parser.EndOfFileException;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
/**
* Adapts the CPreprocessor from the CDT core for use with LPG based parsers.
@ -24,11 +25,11 @@ import org.eclipse.cdt.core.parser.IScanner;
*
*/
class CPreprocessorAdapter {
/**
* During content assist the preprocessor may return a completion token
* which represents the identifier on which the user invoked content assist.
* The the preprocessor normally returns arbitrarily many end-of-completion
* Then the preprocessor normally returns arbitrarily many end-of-completion
* (EOC) tokens.
*
* A bottom-up parser cannot know ahead of time how many EOC tokens are
@ -37,16 +38,12 @@ class CPreprocessorAdapter {
*/
private static final int NUM_EOC_TOKENS = 50;
private static final int DUMMY_TOKEN_KIND = 0;
private static final int DUMMY_TOKEN_KIND = 0;
private static final int tCOMPLETION = org.eclipse.cdt.core.parser.IToken.tCOMPLETION;
private static final int tEOC = org.eclipse.cdt.core.parser.IToken.tEOC;
/**
* Collect the tokens generated by the preprocessor.
*
* TODO: should preprocessor.nextTokenRaw() be called instead?
*/
@SuppressWarnings("restriction")
@ -58,37 +55,40 @@ class CPreprocessorAdapter {
try {
while(true) {
org.eclipse.cdt.core.parser.IToken domToken = preprocessor.nextToken(); // throws EndOfFileException
int newKind = tokenMap.mapKind(domToken);
IToken token = new LPGTokenAdapter(domToken, newKind);
tokenCollector.addToken(token);
// the preprocessor throws EndOfFileException when it reaches the end of input
org.eclipse.cdt.core.parser.IToken domToken = preprocessor.nextToken();
processDOMToken(domToken, tokenCollector, tokenMap);
int type = domToken.getType();
if(type == tCOMPLETION) {
// the token after the completion token must be an EOC token
org.eclipse.cdt.core.parser.IToken domEocToken = preprocessor.nextToken();
assert domEocToken.getType() == tEOC;
for(int i = 0; i < NUM_EOC_TOKENS; i++)
tokenCollector.addToken(createEOCToken(domEocToken, tokenMap));
if(domToken.getType() == tCOMPLETION)
break;
}
}
} catch (EndOfFileException e) {
// just break out of the loop
}
} catch(OffsetLimitReachedException e) {
// preprocessor throws this when content assist is invoked inside a preprocessor directive
org.eclipse.cdt.core.parser.IToken domToken = e.getFinalToken();
assert domToken.getType() == tCOMPLETION;
processDOMToken(domToken, tokenCollector, tokenMap);
} catch (EndOfFileException e) {
// use thrown exception to break out of loop
}
// LPG requires that the token stream end with an EOF token
tokenCollector.addToken(createEOFToken(tokenMap));
}
private static void processDOMToken(org.eclipse.cdt.core.parser.IToken domToken, ITokenCollector tokenCollector, IDOMTokenMap tokenMap) {
int newKind = tokenMap.mapKind(domToken);
tokenCollector.addToken(new LPGTokenAdapter(domToken, newKind));
if(domToken.getType() == tCOMPLETION) {
for(int i = 0; i < NUM_EOC_TOKENS; i++)
tokenCollector.addToken(createEOCToken(tokenMap));
}
}
private static IToken createEOCToken(org.eclipse.cdt.core.parser.IToken domEocToken, IDOMTokenMap tokenMap) {
return new LPGTokenAdapter(domEocToken, tokenMap.mapKind(domEocToken));
private static IToken createEOCToken(IDOMTokenMap tokenMap) {
return new Token(null, 0, 0, tokenMap.getEOCTokenKind());
}
private static IToken createDummyToken() {
@ -99,5 +99,4 @@ class CPreprocessorAdapter {
return new Token(null, 0, 0, tokenMap.getEOFTokenKind());
}
}

View file

@ -17,10 +17,23 @@ import org.eclipse.cdt.core.parser.IToken;
* token kind used by an LPG based parser.
*
* @author Mike Kucera
*
*/
public interface IDOMTokenMap {
/**
* Returns the LPG token kind for the given DOM token.
* @throws NullPointerException if token is null
*/
int mapKind(IToken token);
int getEOFTokenKind();
/**
* Returns the LPG token type for End Of File (TK_EOF_TOKEN) token.
*/
int getEOFTokenKind();
/**
* Returns the LPG token type for End Of Completion (TK_EndOfCompletion) token.
*/
int getEOCTokenKind();
}

View file

@ -19,25 +19,25 @@ import org.eclipse.cdt.core.parser.IToken;
/**
* Maps tokens types returned by CPreprocessor to token types
* expected by the C99 parser.
*
*
* TODO: Make token maps composable.
*
* The idea would be to combine a DOM->C99 map with a C99->UPC map
* to get a DOM->UPC map.
*
*
* @author Mike Kucera
*
*/
public final class DOMToC99TokenMap implements IDOMTokenMap {
public static final DOMToC99TokenMap DEFAULT_MAP = new DOMToC99TokenMap();
private DOMToC99TokenMap() {
// just a private constructor
}
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
public int getEOCTokenKind() {
return TK_EndOfCompletion;
}
public int mapKind(IToken token) {
switch(token.getType()) {
@ -142,10 +142,4 @@ public final class DOMToC99TokenMap implements IDOMTokenMap {
return TK_Invalid;
}
}
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
}

View file

@ -20,13 +20,7 @@ import org.eclipse.cdt.core.parser.IToken;
* Maps tokens types returned by CPreprocessor to token types
* expected by the C++ parser.
*
* TODO: Make token maps composable.
*
* The idea would be to combine a DOM->C99 map with a C99->UPC map
* to get a DOM->UPC map.
*
* @author Mike Kucera
*
*/
public class DOMToISOCPPTokenMap implements IDOMTokenMap {
@ -37,6 +31,14 @@ public class DOMToISOCPPTokenMap implements IDOMTokenMap {
// just a private constructor
}
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
public int getEOCTokenKind() {
return TK_EndOfCompletion;
}
public int mapKind(IToken token) {
switch(token.getType()) {
@ -171,10 +173,5 @@ public class DOMToISOCPPTokenMap implements IDOMTokenMap {
return TK_Invalid;
}
}
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
}

View file

@ -20,7 +20,7 @@ public class UPCC99CompletionParseTest extends C99CompletionParseTest {
public UPCC99CompletionParseTest(String name) { super(name); }
@Override
protected BaseExtensibleLanguage getLanguage() {
protected BaseExtensibleLanguage getC99Language() {
return UPCLanguage.getDefault();
}
}

View file

@ -16,7 +16,6 @@ import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.*;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym;
/**
@ -31,6 +30,14 @@ import org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym;
public class DOMToUPCTokenMap implements IDOMTokenMap {
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
public int getEOCTokenKind() {
return TK_EndOfCompletion;
}
public int mapKind(IToken token) {
switch(token.getType()) {
@ -140,13 +147,5 @@ public class DOMToUPCTokenMap implements IDOMTokenMap {
}
protected String[] getOrderedTerminalSymbols() {
return UPCParsersym.orderedTerminalSymbols;
}
public int getEOFTokenKind() {
return TK_EOF_TOKEN;
}
}