mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-19 23:15:24 +02:00
Refactoring new parser for C++.
This commit is contained in:
parent
87785b3e67
commit
d533e36b40
3 changed files with 434 additions and 566 deletions
|
@ -14,16 +14,33 @@ import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTContinueStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDoStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
|
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTTypeIdExpression;
|
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTTypeIdExpression;
|
||||||
|
@ -41,6 +58,21 @@ import org.eclipse.cdt.core.parser.ParserMode;
|
||||||
import org.eclipse.cdt.internal.core.parser.ParserProblemFactory;
|
import org.eclipse.cdt.internal.core.parser.ParserProblemFactory;
|
||||||
import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory;
|
import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory;
|
||||||
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
|
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTBreakStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTCaseStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTContinueStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTDeclarationStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTDefaultStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTDoStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTExpressionStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTForStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTGotoStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTIfStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTLabelStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTNullStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTReturnStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTSwitchStatement;
|
||||||
|
import org.eclipse.cdt.internal.core.parser2.c.CASTWhileStatement;
|
||||||
import org.eclipse.cdt.internal.core.parser2.cpp.IProblemRequestor;
|
import org.eclipse.cdt.internal.core.parser2.cpp.IProblemRequestor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -583,9 +615,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
|
|
||||||
protected abstract void translationUnit();
|
protected abstract void translationUnit();
|
||||||
|
|
||||||
protected abstract IASTStatement statement() throws EndOfFileException,
|
|
||||||
BacktrackException;
|
|
||||||
|
|
||||||
protected abstract IASTTranslationUnit getTranslationUnit();
|
protected abstract IASTTranslationUnit getTranslationUnit();
|
||||||
|
|
||||||
protected IASTExpression assignmentOperatorExpression(int kind,
|
protected IASTExpression assignmentOperatorExpression(int kind,
|
||||||
|
@ -1173,4 +1202,370 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
return !parsePassed;
|
return !parsePassed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.internal.core.parser2.GNUBaseParser#statement(java.lang.Object)
|
||||||
|
*/
|
||||||
|
protected IASTStatement statement() throws EndOfFileException,
|
||||||
|
BacktrackException {
|
||||||
|
|
||||||
|
switch (LT(1)) {
|
||||||
|
// labeled statements
|
||||||
|
case IToken.t_case:
|
||||||
|
int startOffset = consume(IToken.t_case).getOffset();
|
||||||
|
IASTExpression case_exp = constantExpression();
|
||||||
|
consume(IToken.tCOLON);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTCaseStatement cs = createCaseStatement();
|
||||||
|
((ASTNode)cs).setOffset( startOffset );
|
||||||
|
cs.setExpression( case_exp );
|
||||||
|
case_exp.setParent( cs );
|
||||||
|
case_exp.setPropertyInParent( IASTCaseStatement.EXPRESSION );
|
||||||
|
return cs;
|
||||||
|
case IToken.t_default:
|
||||||
|
startOffset = consume(IToken.t_default).getOffset();
|
||||||
|
consume(IToken.tCOLON);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTDefaultStatement df = createDefaultStatement();
|
||||||
|
((ASTNode)df).setOffset( startOffset );
|
||||||
|
return df;
|
||||||
|
// compound statement
|
||||||
|
case IToken.tLBRACE:
|
||||||
|
IASTCompoundStatement compound = compoundStatement();
|
||||||
|
cleanupLastToken();
|
||||||
|
return compound;
|
||||||
|
// selection statement
|
||||||
|
case IToken.t_if:
|
||||||
|
startOffset = consume(IToken.t_if).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTExpression if_condition = condition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement then_clause = statement();
|
||||||
|
IASTStatement else_clause = null;
|
||||||
|
if (LT(1) == IToken.t_else) {
|
||||||
|
consume(IToken.t_else);
|
||||||
|
else_clause = statement();
|
||||||
|
}
|
||||||
|
|
||||||
|
IASTIfStatement if_stmt = createIfStatement();
|
||||||
|
if_stmt.setCondition( if_condition );
|
||||||
|
((ASTNode)if_stmt).setOffset( startOffset );
|
||||||
|
if_condition.setParent( if_stmt );
|
||||||
|
if_condition.setPropertyInParent( IASTIfStatement.CONDITION );
|
||||||
|
if_stmt.setThenClause( then_clause );
|
||||||
|
then_clause.setParent( if_stmt );
|
||||||
|
then_clause.setPropertyInParent( IASTIfStatement.THEN );
|
||||||
|
if( else_clause != null )
|
||||||
|
{
|
||||||
|
if_stmt.setElseClause( else_clause );
|
||||||
|
else_clause.setParent( if_stmt );
|
||||||
|
else_clause.setPropertyInParent( IASTIfStatement.ELSE );
|
||||||
|
}
|
||||||
|
cleanupLastToken();
|
||||||
|
return if_stmt;
|
||||||
|
case IToken.t_switch:
|
||||||
|
startOffset = consume( IToken.t_switch ).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTExpression switch_condition = condition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement switch_body = statement();
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTSwitchStatement switch_statement = createSwitchStatement();
|
||||||
|
((ASTNode)switch_statement).setOffset( startOffset );
|
||||||
|
switch_statement.setController( switch_condition );
|
||||||
|
switch_condition.setParent( switch_statement );
|
||||||
|
switch_condition.setPropertyInParent( IASTSwitchStatement.CONTROLLER );
|
||||||
|
switch_statement.setBody( switch_body );
|
||||||
|
switch_body.setParent( switch_statement );
|
||||||
|
switch_body.setPropertyInParent( IASTSwitchStatement.BODY );
|
||||||
|
return switch_statement;
|
||||||
|
//iteration statements
|
||||||
|
case IToken.t_while:
|
||||||
|
startOffset = consume(IToken.t_while).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTExpression while_condition = condition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement while_body = statement();
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTWhileStatement while_statement = createWhileStatement();
|
||||||
|
((ASTNode)while_statement).setOffset( startOffset );
|
||||||
|
while_statement.setCondition( while_condition );
|
||||||
|
while_condition.setParent( while_statement );
|
||||||
|
while_condition.setPropertyInParent( IASTWhileStatement.CONDITION );
|
||||||
|
while_statement.setBody( while_body );
|
||||||
|
while_condition.setParent( while_statement );
|
||||||
|
while_condition.setPropertyInParent( IASTWhileStatement.BODY );
|
||||||
|
while_body.setParent( while_statement );
|
||||||
|
return while_statement;
|
||||||
|
case IToken.t_do:
|
||||||
|
startOffset = consume(IToken.t_do).getOffset();
|
||||||
|
IASTStatement do_body = statement();
|
||||||
|
consume(IToken.t_while);
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTExpression do_condition = condition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTDoStatement do_statement = createDoStatement();
|
||||||
|
((ASTNode)do_statement).setOffset( startOffset );
|
||||||
|
do_statement.setBody( do_body );
|
||||||
|
do_body.setParent( do_statement );
|
||||||
|
do_body.setPropertyInParent( IASTDoStatement.BODY );
|
||||||
|
do_statement.setCondition( do_condition );
|
||||||
|
do_condition.setParent( do_statement );
|
||||||
|
do_condition.setPropertyInParent( IASTDoStatement.CONDITION );
|
||||||
|
return do_statement;
|
||||||
|
case IToken.t_for:
|
||||||
|
startOffset = consume( IToken.t_for ).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTNode init = forInitStatement();
|
||||||
|
IASTExpression for_condition = null;
|
||||||
|
if (LT(1) != IToken.tSEMI)
|
||||||
|
for_condition = condition();
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
IASTExpression iterationExpression = null;
|
||||||
|
if (LT(1) != IToken.tRPAREN) {
|
||||||
|
iterationExpression = expression();
|
||||||
|
cleanupLastToken();
|
||||||
|
}
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement for_body = statement();
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTForStatement for_statement = createForStatement();
|
||||||
|
((ASTNode)for_statement).setOffset( startOffset );
|
||||||
|
if( init instanceof IASTDeclaration )
|
||||||
|
{
|
||||||
|
for_statement.setInit((IASTDeclaration) init);
|
||||||
|
((IASTDeclaration) init).setParent( for_statement );
|
||||||
|
((IASTDeclaration) init).setPropertyInParent( IASTForStatement.INITDECLARATION );
|
||||||
|
}
|
||||||
|
else if( init instanceof IASTExpression )
|
||||||
|
{
|
||||||
|
for_statement.setInit((IASTExpression) init);
|
||||||
|
((IASTExpression) init).setParent( for_statement );
|
||||||
|
((IASTExpression) init).setPropertyInParent( IASTForStatement.INITEXPRESSION );
|
||||||
|
}
|
||||||
|
if( for_condition != null )
|
||||||
|
{
|
||||||
|
for_statement.setCondition( for_condition );
|
||||||
|
for_condition.setParent( for_statement );
|
||||||
|
for_condition.setPropertyInParent( IASTForStatement.CONDITION );
|
||||||
|
}
|
||||||
|
if( iterationExpression != null )
|
||||||
|
{
|
||||||
|
for_statement.setIterationExpression( iterationExpression );
|
||||||
|
iterationExpression.setParent( for_statement );
|
||||||
|
iterationExpression.setPropertyInParent( IASTForStatement.ITERATION );
|
||||||
|
}
|
||||||
|
for_statement.setBody( for_body );
|
||||||
|
for_body.setParent( for_statement );
|
||||||
|
for_body.setPropertyInParent( IASTForStatement.BODY );
|
||||||
|
return for_statement;
|
||||||
|
//jump statement
|
||||||
|
case IToken.t_break:
|
||||||
|
startOffset = consume(IToken.t_break).getOffset();
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTBreakStatement break_statement = createBreakStatement();
|
||||||
|
((ASTNode)break_statement).setOffset( startOffset );
|
||||||
|
return break_statement;
|
||||||
|
case IToken.t_continue:
|
||||||
|
startOffset = consume(IToken.t_continue).getOffset();
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTContinueStatement continue_statement = createContinueStatement();
|
||||||
|
((ASTNode)continue_statement).setOffset( startOffset );
|
||||||
|
return continue_statement;
|
||||||
|
case IToken.t_return:
|
||||||
|
startOffset = consume(IToken.t_return).getOffset();
|
||||||
|
IASTExpression result = null;
|
||||||
|
if (LT(1) != IToken.tSEMI) {
|
||||||
|
result = expression();
|
||||||
|
cleanupLastToken();
|
||||||
|
}
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTReturnStatement return_statement = createReturnStatement();
|
||||||
|
((ASTNode)return_statement).setOffset( startOffset );
|
||||||
|
if( result != null )
|
||||||
|
{
|
||||||
|
return_statement.setReturnValue( result );
|
||||||
|
result.setParent( return_statement );
|
||||||
|
result.setPropertyInParent( IASTReturnStatement.RETURNVALUE );
|
||||||
|
}
|
||||||
|
return return_statement;
|
||||||
|
case IToken.t_goto:
|
||||||
|
startOffset = consume(IToken.t_goto).getOffset();
|
||||||
|
IToken identifier = consume(IToken.tIDENTIFIER);
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTName goto_label_name = createName( identifier );
|
||||||
|
IASTGotoStatement goto_statement = createGoToStatement();
|
||||||
|
((ASTNode)goto_statement).setOffset( startOffset );
|
||||||
|
goto_statement.setName( goto_label_name );
|
||||||
|
goto_label_name.setParent( goto_statement );
|
||||||
|
goto_label_name.setPropertyInParent( IASTGotoStatement.NAME );
|
||||||
|
return goto_statement;
|
||||||
|
case IToken.tSEMI:
|
||||||
|
startOffset = consume(IToken.tSEMI ).getOffset();
|
||||||
|
cleanupLastToken();
|
||||||
|
IASTNullStatement null_statement = createNullStatement();
|
||||||
|
((ASTNode)null_statement).setOffset( startOffset );
|
||||||
|
return null_statement;
|
||||||
|
default:
|
||||||
|
// can be many things:
|
||||||
|
// label
|
||||||
|
if (LT(1) == IToken.tIDENTIFIER && LT(2) == IToken.tCOLON) {
|
||||||
|
IToken labelName = consume(IToken.tIDENTIFIER);
|
||||||
|
consume(IToken.tCOLON);
|
||||||
|
IASTLabelStatement label_statement = createLabelStatement();
|
||||||
|
((ASTNode)label_statement).setOffset( labelName.getOffset() );
|
||||||
|
IASTName name = createName( labelName );
|
||||||
|
label_statement.setName( name );
|
||||||
|
name.setParent( label_statement );
|
||||||
|
name.setPropertyInParent( IASTLabelStatement.NAME );
|
||||||
|
return label_statement;
|
||||||
|
}
|
||||||
|
// expressionStatement
|
||||||
|
// Note: the function style cast ambiguity is handled in
|
||||||
|
// expression
|
||||||
|
// Since it only happens when we are in a statement
|
||||||
|
IToken mark = mark();
|
||||||
|
try {
|
||||||
|
IASTExpression expression = expression();
|
||||||
|
consume(IToken.tSEMI);
|
||||||
|
IASTExpressionStatement expressionStatement = createExpressionStatement();
|
||||||
|
expressionStatement.setExpression( expression );
|
||||||
|
expression.setParent( expressionStatement );
|
||||||
|
expression.setPropertyInParent( IASTExpressionStatement.EXPFRESSION );
|
||||||
|
cleanupLastToken();
|
||||||
|
return expressionStatement;
|
||||||
|
} catch (BacktrackException b) {
|
||||||
|
backup(mark);
|
||||||
|
}
|
||||||
|
|
||||||
|
// declarationStatement
|
||||||
|
IASTDeclaration d = declaration();
|
||||||
|
IASTDeclarationStatement ds = createDeclarationStatement();
|
||||||
|
ds.setDeclaration(d);
|
||||||
|
d.setParent( ds );
|
||||||
|
d.setPropertyInParent( IASTDeclarationStatement.DECLARATION );
|
||||||
|
cleanupLastToken();
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract IASTDeclaration declaration() throws BacktrackException, EndOfFileException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTLabelStatement createLabelStatement() {
|
||||||
|
return new CASTLabelStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTGotoStatement createGoToStatement() {
|
||||||
|
return new CASTGotoStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTReturnStatement createReturnStatement() {
|
||||||
|
return new CASTReturnStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTForStatement createForStatement() {
|
||||||
|
return new CASTForStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTContinueStatement createContinueStatement() {
|
||||||
|
return new CASTContinueStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTDoStatement createDoStatement() {
|
||||||
|
return new CASTDoStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTBreakStatement createBreakStatement() {
|
||||||
|
return new CASTBreakStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTWhileStatement createWhileStatement() {
|
||||||
|
return new CASTWhileStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTNullStatement createNullStatement() {
|
||||||
|
return new CASTNullStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTSwitchStatement createSwitchStatement() {
|
||||||
|
return new CASTSwitchStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTIfStatement createIfStatement() {
|
||||||
|
return new CASTIfStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTDefaultStatement createDefaultStatement() {
|
||||||
|
return new CASTDefaultStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTCaseStatement createCaseStatement() {
|
||||||
|
return new CASTCaseStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTExpressionStatement createExpressionStatement() {
|
||||||
|
return new CASTExpressionStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTDeclarationStatement createDeclarationStatement() {
|
||||||
|
return new CASTDeclarationStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract IASTNode forInitStatement() throws BacktrackException,
|
||||||
|
EndOfFileException;
|
||||||
}
|
}
|
|
@ -1071,365 +1071,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
return new CASTIdExpression();
|
return new CASTIdExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.cdt.internal.core.parser2.GNUBaseParser#statement(java.lang.Object)
|
|
||||||
*/
|
|
||||||
protected IASTStatement statement() throws EndOfFileException,
|
|
||||||
BacktrackException {
|
|
||||||
|
|
||||||
switch (LT(1)) {
|
|
||||||
// labeled statements
|
|
||||||
case IToken.t_case:
|
|
||||||
int startOffset = consume(IToken.t_case).getOffset();
|
|
||||||
IASTExpression case_exp = constantExpression();
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTCaseStatement cs = createCaseStatement();
|
|
||||||
((CASTNode)cs).setOffset( startOffset );
|
|
||||||
cs.setExpression( case_exp );
|
|
||||||
case_exp.setParent( cs );
|
|
||||||
case_exp.setPropertyInParent( IASTCaseStatement.EXPRESSION );
|
|
||||||
return cs;
|
|
||||||
case IToken.t_default:
|
|
||||||
startOffset = consume(IToken.t_default).getOffset();
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTDefaultStatement df = createDefaultStatement();
|
|
||||||
((CASTNode)df).setOffset( startOffset );
|
|
||||||
return df;
|
|
||||||
// compound statement
|
|
||||||
case IToken.tLBRACE:
|
|
||||||
IASTCompoundStatement compound = compoundStatement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return compound;
|
|
||||||
// selection statement
|
|
||||||
case IToken.t_if:
|
|
||||||
startOffset = consume(IToken.t_if).getOffset();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTExpression if_condition = condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
IASTStatement then_clause = statement();
|
|
||||||
IASTStatement else_clause = null;
|
|
||||||
if (LT(1) == IToken.t_else) {
|
|
||||||
consume(IToken.t_else);
|
|
||||||
else_clause = statement();
|
|
||||||
}
|
|
||||||
|
|
||||||
IASTIfStatement if_stmt = createIfStatement();
|
|
||||||
if_stmt.setCondition( if_condition );
|
|
||||||
((CASTNode)if_stmt).setOffset( startOffset );
|
|
||||||
if_condition.setParent( if_stmt );
|
|
||||||
if_condition.setPropertyInParent( IASTIfStatement.CONDITION );
|
|
||||||
if_stmt.setThenClause( then_clause );
|
|
||||||
then_clause.setParent( if_stmt );
|
|
||||||
then_clause.setPropertyInParent( IASTIfStatement.THEN );
|
|
||||||
if( else_clause != null )
|
|
||||||
{
|
|
||||||
if_stmt.setElseClause( else_clause );
|
|
||||||
else_clause.setParent( if_stmt );
|
|
||||||
else_clause.setPropertyInParent( IASTIfStatement.ELSE );
|
|
||||||
}
|
|
||||||
cleanupLastToken();
|
|
||||||
return if_stmt;
|
|
||||||
case IToken.t_switch:
|
|
||||||
startOffset = consume( IToken.t_switch ).getOffset();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTExpression switch_condition = condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
IASTStatement switch_body = statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTSwitchStatement switch_statement = createSwitchStatement();
|
|
||||||
((CASTNode)switch_statement).setOffset( startOffset );
|
|
||||||
switch_statement.setController( switch_condition );
|
|
||||||
switch_condition.setParent( switch_statement );
|
|
||||||
switch_condition.setPropertyInParent( IASTSwitchStatement.CONTROLLER );
|
|
||||||
switch_statement.setBody( switch_body );
|
|
||||||
switch_body.setParent( switch_statement );
|
|
||||||
switch_body.setPropertyInParent( IASTSwitchStatement.BODY );
|
|
||||||
return switch_statement;
|
|
||||||
//iteration statements
|
|
||||||
case IToken.t_while:
|
|
||||||
startOffset = consume(IToken.t_while).getOffset();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTExpression while_condition = condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
IASTStatement while_body = statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTWhileStatement while_statement = createWhileStatement();
|
|
||||||
((CASTNode)while_statement).setOffset( startOffset );
|
|
||||||
while_statement.setCondition( while_condition );
|
|
||||||
while_condition.setParent( while_statement );
|
|
||||||
while_condition.setPropertyInParent( IASTWhileStatement.CONDITION );
|
|
||||||
while_statement.setBody( while_body );
|
|
||||||
while_condition.setParent( while_statement );
|
|
||||||
while_condition.setPropertyInParent( IASTWhileStatement.BODY );
|
|
||||||
while_body.setParent( while_statement );
|
|
||||||
return while_statement;
|
|
||||||
case IToken.t_do:
|
|
||||||
startOffset = consume(IToken.t_do).getOffset();
|
|
||||||
IASTStatement do_body = statement();
|
|
||||||
consume(IToken.t_while);
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTExpression do_condition = condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTDoStatement do_statement = createDoStatement();
|
|
||||||
((CASTNode)do_statement).setOffset( startOffset );
|
|
||||||
do_statement.setBody( do_body );
|
|
||||||
do_body.setParent( do_statement );
|
|
||||||
do_body.setPropertyInParent( IASTDoStatement.BODY );
|
|
||||||
do_statement.setCondition( do_condition );
|
|
||||||
do_condition.setParent( do_statement );
|
|
||||||
do_condition.setPropertyInParent( IASTDoStatement.CONDITION );
|
|
||||||
return do_statement;
|
|
||||||
case IToken.t_for:
|
|
||||||
startOffset = consume( IToken.t_for ).getOffset();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTNode init = forInitStatement();
|
|
||||||
IASTExpression for_condition = null;
|
|
||||||
if (LT(1) != IToken.tSEMI)
|
|
||||||
for_condition = condition();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
IASTExpression iterationExpression = null;
|
|
||||||
if (LT(1) != IToken.tRPAREN) {
|
|
||||||
iterationExpression = expression();
|
|
||||||
cleanupLastToken();
|
|
||||||
}
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
IASTStatement for_body = statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTForStatement for_statement = createForStatement();
|
|
||||||
((CASTNode)for_statement).setOffset( startOffset );
|
|
||||||
if( init instanceof IASTDeclaration )
|
|
||||||
{
|
|
||||||
for_statement.setInit((IASTDeclaration) init);
|
|
||||||
((IASTDeclaration) init).setParent( for_statement );
|
|
||||||
((IASTDeclaration) init).setPropertyInParent( IASTForStatement.INITDECLARATION );
|
|
||||||
}
|
|
||||||
else if( init instanceof IASTExpression )
|
|
||||||
{
|
|
||||||
for_statement.setInit((IASTExpression) init);
|
|
||||||
((IASTExpression) init).setParent( for_statement );
|
|
||||||
((IASTExpression) init).setPropertyInParent( IASTForStatement.INITEXPRESSION );
|
|
||||||
}
|
|
||||||
if( for_condition != null )
|
|
||||||
{
|
|
||||||
for_statement.setCondition( for_condition );
|
|
||||||
for_condition.setParent( for_statement );
|
|
||||||
for_condition.setPropertyInParent( IASTForStatement.CONDITION );
|
|
||||||
}
|
|
||||||
if( iterationExpression != null )
|
|
||||||
{
|
|
||||||
for_statement.setIterationExpression( iterationExpression );
|
|
||||||
iterationExpression.setParent( for_statement );
|
|
||||||
iterationExpression.setPropertyInParent( IASTForStatement.ITERATION );
|
|
||||||
}
|
|
||||||
for_statement.setBody( for_body );
|
|
||||||
for_body.setParent( for_statement );
|
|
||||||
for_body.setPropertyInParent( IASTForStatement.BODY );
|
|
||||||
return for_statement;
|
|
||||||
//jump statement
|
|
||||||
case IToken.t_break:
|
|
||||||
startOffset = consume(IToken.t_break).getOffset();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTBreakStatement break_statement = createBreakStatement();
|
|
||||||
((CASTNode)break_statement).setOffset( startOffset );
|
|
||||||
return break_statement;
|
|
||||||
case IToken.t_continue:
|
|
||||||
startOffset = consume(IToken.t_continue).getOffset();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTContinueStatement continue_statement = createContinueStatement();
|
|
||||||
((CASTNode)continue_statement).setOffset( startOffset );
|
|
||||||
return continue_statement;
|
|
||||||
case IToken.t_return:
|
|
||||||
startOffset = consume(IToken.t_return).getOffset();
|
|
||||||
IASTExpression result = null;
|
|
||||||
if (LT(1) != IToken.tSEMI) {
|
|
||||||
result = expression();
|
|
||||||
cleanupLastToken();
|
|
||||||
}
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTReturnStatement return_statement = createReturnStatement();
|
|
||||||
((CASTNode)return_statement).setOffset( startOffset );
|
|
||||||
if( result != null )
|
|
||||||
{
|
|
||||||
return_statement.setReturnValue( result );
|
|
||||||
result.setParent( return_statement );
|
|
||||||
result.setPropertyInParent( IASTReturnStatement.RETURNVALUE );
|
|
||||||
}
|
|
||||||
return return_statement;
|
|
||||||
case IToken.t_goto:
|
|
||||||
startOffset = consume(IToken.t_goto).getOffset();
|
|
||||||
IToken identifier = consume(IToken.tIDENTIFIER);
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTName goto_label_name = createName( identifier );
|
|
||||||
IASTGotoStatement goto_statement = createGoToStatement();
|
|
||||||
((CASTNode)goto_statement).setOffset( startOffset );
|
|
||||||
goto_statement.setName( goto_label_name );
|
|
||||||
goto_label_name.setParent( goto_statement );
|
|
||||||
goto_label_name.setPropertyInParent( IASTGotoStatement.NAME );
|
|
||||||
return goto_statement;
|
|
||||||
case IToken.tSEMI:
|
|
||||||
startOffset = consume(IToken.tSEMI ).getOffset();
|
|
||||||
cleanupLastToken();
|
|
||||||
IASTNullStatement null_statement = createNullStatement();
|
|
||||||
((CASTNode)null_statement).setOffset( startOffset );
|
|
||||||
return null_statement;
|
|
||||||
default:
|
|
||||||
// can be many things:
|
|
||||||
// label
|
|
||||||
if (LT(1) == IToken.tIDENTIFIER && LT(2) == IToken.tCOLON) {
|
|
||||||
IToken labelName = consume(IToken.tIDENTIFIER);
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
IASTLabelStatement label_statement = createLabelStatement();
|
|
||||||
((CASTNode)label_statement).setOffset( labelName.getOffset() );
|
|
||||||
IASTName name = createName( labelName );
|
|
||||||
label_statement.setName( name );
|
|
||||||
name.setParent( label_statement );
|
|
||||||
name.setPropertyInParent( IASTLabelStatement.NAME );
|
|
||||||
return label_statement;
|
|
||||||
}
|
|
||||||
// expressionStatement
|
|
||||||
// Note: the function style cast ambiguity is handled in
|
|
||||||
// expression
|
|
||||||
// Since it only happens when we are in a statement
|
|
||||||
IToken mark = mark();
|
|
||||||
try {
|
|
||||||
IASTExpression expression = expression();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
IASTExpressionStatement expressionStatement = createExpressionStatement();
|
|
||||||
expressionStatement.setExpression( expression );
|
|
||||||
expression.setParent( expressionStatement );
|
|
||||||
expression.setPropertyInParent( IASTExpressionStatement.EXPFRESSION );
|
|
||||||
cleanupLastToken();
|
|
||||||
return expressionStatement;
|
|
||||||
} catch (BacktrackException b) {
|
|
||||||
backup(mark);
|
|
||||||
}
|
|
||||||
|
|
||||||
// declarationStatement
|
|
||||||
IASTDeclaration d = declaration();
|
|
||||||
IASTDeclarationStatement ds = createDeclarationStatement();
|
|
||||||
ds.setDeclaration(d);
|
|
||||||
d.setParent( ds );
|
|
||||||
d.setPropertyInParent( IASTDeclarationStatement.DECLARATION );
|
|
||||||
cleanupLastToken();
|
|
||||||
return ds;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTLabelStatement createLabelStatement() {
|
|
||||||
return new CASTLabelStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTGotoStatement createGoToStatement() {
|
|
||||||
return new CASTGotoStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTReturnStatement createReturnStatement() {
|
|
||||||
return new CASTReturnStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTForStatement createForStatement() {
|
|
||||||
return new CASTForStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTContinueStatement createContinueStatement() {
|
|
||||||
return new CASTContinueStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTDoStatement createDoStatement() {
|
|
||||||
return new CASTDoStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTBreakStatement createBreakStatement() {
|
|
||||||
return new CASTBreakStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTWhileStatement createWhileStatement() {
|
|
||||||
return new CASTWhileStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTNullStatement createNullStatement() {
|
|
||||||
return new CASTNullStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTSwitchStatement createSwitchStatement() {
|
|
||||||
return new CASTSwitchStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTIfStatement createIfStatement() {
|
|
||||||
return new CASTIfStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTDefaultStatement createDefaultStatement() {
|
|
||||||
return new CASTDefaultStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTCaseStatement createCaseStatement() {
|
|
||||||
return new CASTCaseStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTExpressionStatement createExpressionStatement() {
|
|
||||||
return new CASTExpressionStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected IASTDeclarationStatement createDeclarationStatement() {
|
|
||||||
return new CASTDeclarationStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IASTTypeId typeId(boolean skipArrayModifiers)
|
protected IASTTypeId typeId(boolean skipArrayModifiers)
|
||||||
throws EndOfFileException, BacktrackException {
|
throws EndOfFileException, BacktrackException {
|
||||||
IToken mark = mark();
|
IToken mark = mark();
|
||||||
|
|
|
@ -16,10 +16,12 @@ import java.util.List;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
|
@ -2067,7 +2069,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request for a backtrack
|
* request for a backtrack
|
||||||
*/
|
*/
|
||||||
protected Object usingClause(Object scope) throws EndOfFileException,
|
protected Object usingClause() throws EndOfFileException,
|
||||||
BacktrackException {
|
BacktrackException {
|
||||||
IToken firstToken = consume(IToken.t_using);
|
IToken firstToken = consume(IToken.t_using);
|
||||||
|
|
||||||
|
@ -2167,7 +2169,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request for a backtrack
|
* request for a backtrack
|
||||||
*/
|
*/
|
||||||
protected Object linkageSpecification(Object scope)
|
protected Object linkageSpecification()
|
||||||
throws EndOfFileException, BacktrackException {
|
throws EndOfFileException, BacktrackException {
|
||||||
IToken firstToken = consume(IToken.t_extern);
|
IToken firstToken = consume(IToken.t_extern);
|
||||||
if (LT(1) != IToken.tSTRING)
|
if (LT(1) != IToken.tSTRING)
|
||||||
|
@ -2202,7 +2204,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
break linkageDeclarationLoop;
|
break linkageDeclarationLoop;
|
||||||
default:
|
default:
|
||||||
try {
|
try {
|
||||||
declaration(linkage, null);
|
declaration();
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
failParse(bt);
|
failParse(bt);
|
||||||
if (checkToken == LA(1).hashCode())
|
if (checkToken == LA(1).hashCode())
|
||||||
|
@ -2240,7 +2242,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
// linkage.enterScope( requestor );
|
// linkage.enterScope( requestor );
|
||||||
try {
|
try {
|
||||||
declaration(linkage, null);
|
declaration();
|
||||||
} finally {
|
} finally {
|
||||||
// linkage.exitScope( requestor );
|
// linkage.exitScope( requestor );
|
||||||
}
|
}
|
||||||
|
@ -2264,7 +2266,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request for a backtrack
|
* request for a backtrack
|
||||||
*/
|
*/
|
||||||
protected Object templateDeclaration(Object scope)
|
protected Object templateDeclaration()
|
||||||
throws EndOfFileException, BacktrackException {
|
throws EndOfFileException, BacktrackException {
|
||||||
IToken mark = mark();
|
IToken mark = mark();
|
||||||
IToken firstToken = null;
|
IToken firstToken = null;
|
||||||
|
@ -2310,7 +2312,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
// templateInstantiation.enterScope( requestor );
|
// templateInstantiation.enterScope( requestor );
|
||||||
try {
|
try {
|
||||||
declaration(templateInstantiation, templateInstantiation);
|
declaration();
|
||||||
// templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(),
|
// templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(),
|
||||||
// lastToken.getLineNumber());
|
// lastToken.getLineNumber());
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -2342,7 +2344,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
// templateSpecialization.enterScope(requestor);
|
// templateSpecialization.enterScope(requestor);
|
||||||
try {
|
try {
|
||||||
declaration(templateSpecialization, templateSpecialization);
|
declaration();
|
||||||
// templateSpecialization.setEndingOffsetAndLineNumber(
|
// templateSpecialization.setEndingOffsetAndLineNumber(
|
||||||
// lastToken.getEndOffset(), lastToken.getLineNumber());
|
// lastToken.getEndOffset(), lastToken.getLineNumber());
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -2352,7 +2354,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
List parms = templateParameterList(scope);
|
List parms = templateParameterList();
|
||||||
IToken gt = consume(IToken.tGT);
|
IToken gt = consume(IToken.tGT);
|
||||||
Object templateDecl;
|
Object templateDecl;
|
||||||
try {
|
try {
|
||||||
|
@ -2371,7 +2373,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
// templateDecl.enterScope( requestor );
|
// templateDecl.enterScope( requestor );
|
||||||
try {
|
try {
|
||||||
declaration(templateDecl, templateDecl);
|
declaration();
|
||||||
// templateDecl.setEndingOffsetAndLineNumber(
|
// templateDecl.setEndingOffsetAndLineNumber(
|
||||||
// lastToken.getEndOffset(), lastToken.getLineNumber() );
|
// lastToken.getEndOffset(), lastToken.getLineNumber() );
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -2405,15 +2407,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request for a backtrack
|
* request for a backtrack
|
||||||
*/
|
*/
|
||||||
protected List templateParameterList(Object scope)
|
protected List templateParameterList()
|
||||||
throws BacktrackException, EndOfFileException {
|
throws BacktrackException, EndOfFileException {
|
||||||
// if we have gotten this far then we have a true template-declaration
|
// if we have gotten this far then we have a true template-declaration
|
||||||
// iterate through the template parameter list
|
// iterate through the template parameter list
|
||||||
List returnValue = new ArrayList();
|
List returnValue = new ArrayList();
|
||||||
|
|
||||||
Object parameterScope = null; /* astFactory.createNewCodeBlock( scope ); */
|
Object parameterScope = null; /* astFactory.createNewCodeBlock( scope ); */
|
||||||
if (parameterScope == null)
|
|
||||||
parameterScope = scope;
|
|
||||||
|
|
||||||
IToken la = LA(1);
|
IToken la = LA(1);
|
||||||
int startingOffset = la.getOffset();
|
int startingOffset = la.getOffset();
|
||||||
|
@ -2484,7 +2484,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
IToken startingToken = lastToken;
|
IToken startingToken = lastToken;
|
||||||
consume(IToken.tLT);
|
consume(IToken.tLT);
|
||||||
|
|
||||||
List subResult = templateParameterList(parameterScope);
|
List subResult = templateParameterList();
|
||||||
consume(IToken.tGT);
|
consume(IToken.tGT);
|
||||||
consume(IToken.t_class);
|
consume(IToken.t_class);
|
||||||
IToken optionalId = null;
|
IToken optionalId = null;
|
||||||
|
@ -2602,7 +2602,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request a backtrack
|
* request a backtrack
|
||||||
*/
|
*/
|
||||||
protected void declaration(Object scope, Object ownerTemplate)
|
protected IASTDeclaration declaration()
|
||||||
throws EndOfFileException, BacktrackException {
|
throws EndOfFileException, BacktrackException {
|
||||||
switch (LT(1)) {
|
switch (LT(1)) {
|
||||||
case IToken.t_asm:
|
case IToken.t_asm:
|
||||||
|
@ -2629,40 +2629,40 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
// resultDeclaration.acceptElement(requestor);
|
// resultDeclaration.acceptElement(requestor);
|
||||||
break;
|
break;
|
||||||
case IToken.t_namespace:
|
case IToken.t_namespace:
|
||||||
namespaceDefinition(scope);
|
namespaceDefinition();
|
||||||
break;
|
break;
|
||||||
case IToken.t_using:
|
case IToken.t_using:
|
||||||
usingClause(scope);
|
usingClause();
|
||||||
break;
|
break;
|
||||||
case IToken.t_export:
|
case IToken.t_export:
|
||||||
case IToken.t_template:
|
case IToken.t_template:
|
||||||
templateDeclaration(scope);
|
templateDeclaration();
|
||||||
break;
|
break;
|
||||||
case IToken.t_extern:
|
case IToken.t_extern:
|
||||||
if (LT(2) == IToken.tSTRING) {
|
if (LT(2) == IToken.tSTRING) {
|
||||||
linkageSpecification(scope);
|
linkageSpecification();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if (supportExtendedTemplateSyntax
|
if (supportExtendedTemplateSyntax
|
||||||
&& (LT(1) == IToken.t_static || LT(1) == IToken.t_inline || LT(1) == IToken.t_extern)
|
&& (LT(1) == IToken.t_static || LT(1) == IToken.t_inline || LT(1) == IToken.t_extern)
|
||||||
&& LT(2) == IToken.t_template)
|
&& LT(2) == IToken.t_template)
|
||||||
templateDeclaration(scope);
|
templateDeclaration();
|
||||||
else
|
else
|
||||||
simpleDeclarationStrategyUnion(scope, ownerTemplate);
|
simpleDeclarationStrategyUnion();
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanupLastToken();
|
cleanupLastToken();
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Object simpleDeclarationStrategyUnion(Object scope,
|
protected Object simpleDeclarationStrategyUnion() throws EndOfFileException, BacktrackException {
|
||||||
Object ownerTemplate) throws EndOfFileException, BacktrackException {
|
|
||||||
simpleDeclarationMark = mark();
|
simpleDeclarationMark = mark();
|
||||||
IProblem firstFailure = null;
|
IProblem firstFailure = null;
|
||||||
IProblem secondFailure = null;
|
IProblem secondFailure = null;
|
||||||
try {
|
try {
|
||||||
return simpleDeclaration(SimpleDeclarationStrategy.TRY_CONSTRUCTOR,
|
return simpleDeclaration(SimpleDeclarationStrategy.TRY_CONSTRUCTOR,
|
||||||
ownerTemplate, false);
|
false);
|
||||||
// try it first with the original strategy
|
// try it first with the original strategy
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
if (simpleDeclarationMark == null)
|
if (simpleDeclarationMark == null)
|
||||||
|
@ -2673,8 +2673,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return simpleDeclaration(
|
return simpleDeclaration(
|
||||||
SimpleDeclarationStrategy.TRY_FUNCTION, ownerTemplate,
|
SimpleDeclarationStrategy.TRY_FUNCTION, false);
|
||||||
false);
|
|
||||||
} catch (BacktrackException bt2) {
|
} catch (BacktrackException bt2) {
|
||||||
if (simpleDeclarationMark == null) {
|
if (simpleDeclarationMark == null) {
|
||||||
if (firstFailure != null && (bt2.getProblem() == null))
|
if (firstFailure != null && (bt2.getProblem() == null))
|
||||||
|
@ -2688,8 +2687,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return simpleDeclaration(
|
return simpleDeclaration(
|
||||||
SimpleDeclarationStrategy.TRY_VARIABLE, ownerTemplate,
|
SimpleDeclarationStrategy.TRY_VARIABLE, false);
|
||||||
false);
|
|
||||||
} catch (BacktrackException b3) {
|
} catch (BacktrackException b3) {
|
||||||
backup(simpleDeclarationMark); //TODO - necessary?
|
backup(simpleDeclarationMark); //TODO - necessary?
|
||||||
|
|
||||||
|
@ -2720,7 +2718,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* request a backtrack
|
* request a backtrack
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected Object namespaceDefinition(Object scope)
|
protected Object namespaceDefinition()
|
||||||
throws BacktrackException, EndOfFileException {
|
throws BacktrackException, EndOfFileException {
|
||||||
IToken first = consume(IToken.t_namespace);
|
IToken first = consume(IToken.t_namespace);
|
||||||
|
|
||||||
|
@ -2770,7 +2768,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
break namespaceDeclarationLoop;
|
break namespaceDeclarationLoop;
|
||||||
default:
|
default:
|
||||||
try {
|
try {
|
||||||
declaration(namespaceDefinition, null);
|
declaration();
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
failParse(bt);
|
failParse(bt);
|
||||||
if (checkToken == LA(1).hashCode())
|
if (checkToken == LA(1).hashCode())
|
||||||
|
@ -2844,13 +2842,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* @param tryConstructor
|
* @param tryConstructor
|
||||||
* true == take strategy1 (constructor ) : false == take strategy
|
* true == take strategy1 (constructor ) : false == take strategy
|
||||||
* 2 ( pointer to function)
|
* 2 ( pointer to function)
|
||||||
*
|
|
||||||
* @return TODO
|
* @return TODO
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
* request a backtrack
|
* request a backtrack
|
||||||
*/
|
*/
|
||||||
protected Object simpleDeclaration(SimpleDeclarationStrategy strategy,
|
protected Object simpleDeclaration(SimpleDeclarationStrategy strategy,
|
||||||
Object ownerTemplate, boolean fromCatchHandler)
|
boolean fromCatchHandler)
|
||||||
throws BacktrackException, EndOfFileException {
|
throws BacktrackException, EndOfFileException {
|
||||||
IToken firstToken = LA(1);
|
IToken firstToken = LA(1);
|
||||||
int firstOffset = firstToken.getOffset();
|
int firstOffset = firstToken.getOffset();
|
||||||
|
@ -2860,7 +2857,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
throwBacktrack(firstToken.getOffset(), firstToken.getEndOffset(),
|
throwBacktrack(firstToken.getOffset(), firstToken.getEndOffset(),
|
||||||
firstToken.getLineNumber(), firstToken.getFilename());
|
firstToken.getLineNumber(), firstToken.getFilename());
|
||||||
DeclarationWrapper sdw = new DeclarationWrapper(null, firstToken
|
DeclarationWrapper sdw = new DeclarationWrapper(null, firstToken
|
||||||
.getOffset(), firstToken.getLineNumber(), ownerTemplate, fn);
|
.getOffset(), firstToken.getLineNumber(), null, fn);
|
||||||
firstToken = null; // necessary for scalability
|
firstToken = null; // necessary for scalability
|
||||||
|
|
||||||
declSpecifierSeq(sdw, false,
|
declSpecifierSeq(sdw, false,
|
||||||
|
@ -4091,7 +4088,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
break memberDeclarationLoop;
|
break memberDeclarationLoop;
|
||||||
default:
|
default:
|
||||||
try {
|
try {
|
||||||
declaration(astClassSpecifier, null);
|
declaration();
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
if (checkToken == LA(1).hashCode())
|
if (checkToken == LA(1).hashCode())
|
||||||
failParseWithErrorHandling();
|
failParseWithErrorHandling();
|
||||||
|
@ -4220,173 +4217,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a statement.
|
|
||||||
*
|
|
||||||
* @throws BacktrackException
|
|
||||||
* request a backtrack
|
|
||||||
*/
|
|
||||||
protected IASTStatement statement() throws EndOfFileException,
|
|
||||||
BacktrackException {
|
|
||||||
|
|
||||||
switch (LT(1)) {
|
|
||||||
case IToken.t_case:
|
|
||||||
consume(IToken.t_case);
|
|
||||||
constantExpression();
|
|
||||||
cleanupLastToken();
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_default:
|
|
||||||
consume(IToken.t_default);
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.tLBRACE:
|
|
||||||
compoundStatement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_if:
|
|
||||||
consume(IToken.t_if);
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
if (LT(1) != IToken.tLBRACE)
|
|
||||||
statement();
|
|
||||||
else
|
|
||||||
statement();
|
|
||||||
if (LT(1) == IToken.t_else) {
|
|
||||||
consume(IToken.t_else);
|
|
||||||
if (LT(1) == IToken.t_if) {
|
|
||||||
//an else if, return and get the rest of the else if as
|
|
||||||
// the next statement instead of recursing
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
} else if (LT(1) != IToken.tLBRACE)
|
|
||||||
statement();
|
|
||||||
else
|
|
||||||
statement();
|
|
||||||
}
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_switch:
|
|
||||||
consume();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_while:
|
|
||||||
consume(IToken.t_while);
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
if (LT(1) != IToken.tLBRACE)
|
|
||||||
statement();
|
|
||||||
else
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_do:
|
|
||||||
consume(IToken.t_do);
|
|
||||||
if (LT(1) != IToken.tLBRACE)
|
|
||||||
statement();
|
|
||||||
else
|
|
||||||
statement();
|
|
||||||
consume(IToken.t_while);
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_for:
|
|
||||||
consume();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
forInitStatement();
|
|
||||||
if (LT(1) != IToken.tSEMI)
|
|
||||||
condition();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
if (LT(1) != IToken.tRPAREN) {
|
|
||||||
expression();
|
|
||||||
cleanupLastToken();
|
|
||||||
}
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_break:
|
|
||||||
consume();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_continue:
|
|
||||||
consume();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_return:
|
|
||||||
consume();
|
|
||||||
if (LT(1) != IToken.tSEMI) {
|
|
||||||
expression();
|
|
||||||
cleanupLastToken();
|
|
||||||
}
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_goto:
|
|
||||||
consume();
|
|
||||||
consume(IToken.tIDENTIFIER);
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.t_try:
|
|
||||||
consume();
|
|
||||||
compoundStatement();
|
|
||||||
catchHandlerSequence();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
case IToken.tSEMI:
|
|
||||||
consume();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
default:
|
|
||||||
// can be many things:
|
|
||||||
// label
|
|
||||||
|
|
||||||
if (LT(1) == IToken.tIDENTIFIER
|
|
||||||
&& LT(2) == IToken.tCOLON) {
|
|
||||||
consume(IToken.tIDENTIFIER);
|
|
||||||
consume(IToken.tCOLON);
|
|
||||||
statement();
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// expressionStatement
|
|
||||||
// Note: the function style cast ambiguity is handled in
|
|
||||||
// expression
|
|
||||||
// Since it only happens when we are in a statement
|
|
||||||
IToken mark = mark();
|
|
||||||
Object expressionStatement = null;
|
|
||||||
try {
|
|
||||||
expressionStatement = expression();
|
|
||||||
consume(IToken.tSEMI);
|
|
||||||
cleanupLastToken();
|
|
||||||
return null;
|
|
||||||
} catch (BacktrackException b) {
|
|
||||||
backup(mark);
|
|
||||||
// if (expressionStatement != null)
|
|
||||||
// expressionStatement.freeReferences();
|
|
||||||
}
|
|
||||||
|
|
||||||
// declarationStatement
|
|
||||||
declaration(null, null);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void catchHandlerSequence()
|
protected void catchHandlerSequence()
|
||||||
throws EndOfFileException, BacktrackException {
|
throws EndOfFileException, BacktrackException {
|
||||||
|
@ -4403,7 +4233,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
consume(IToken.tELLIPSIS);
|
consume(IToken.tELLIPSIS);
|
||||||
else
|
else
|
||||||
simpleDeclaration(SimpleDeclarationStrategy.TRY_VARIABLE,
|
simpleDeclaration(SimpleDeclarationStrategy.TRY_VARIABLE,
|
||||||
null, true);
|
true);
|
||||||
consume(IToken.tRPAREN);
|
consume(IToken.tRPAREN);
|
||||||
|
|
||||||
catchBlockCompoundStatement();
|
catchBlockCompoundStatement();
|
||||||
|
@ -4432,21 +4262,23 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
/**
|
/**
|
||||||
* @throws BacktrackException
|
* @throws BacktrackException
|
||||||
*/
|
*/
|
||||||
protected void forInitStatement() throws BacktrackException,
|
protected IASTNode forInitStatement() throws BacktrackException,
|
||||||
EndOfFileException {
|
EndOfFileException {
|
||||||
IToken mark = mark();
|
IToken mark = mark();
|
||||||
try {
|
try {
|
||||||
expression();
|
expression();
|
||||||
consume(IToken.tSEMI);
|
consume(IToken.tSEMI);
|
||||||
// e.acceptElement(requestor);
|
// e.acceptElement(requestor);
|
||||||
|
return null;
|
||||||
|
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
backup(mark);
|
backup(mark);
|
||||||
try {
|
try {
|
||||||
simpleDeclarationStrategyUnion(null, null);
|
return (IASTNode) simpleDeclarationStrategyUnion();
|
||||||
} catch (BacktrackException b) {
|
} catch (BacktrackException b) {
|
||||||
failParse(b);
|
failParse(b);
|
||||||
throwBacktrack(b);
|
throwBacktrack(b);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4471,7 +4303,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
int checkOffset = LA(1).hashCode();
|
int checkOffset = LA(1).hashCode();
|
||||||
declaration(translationUnit, null);
|
declaration();
|
||||||
if (LA(1).hashCode() == checkOffset)
|
if (LA(1).hashCode() == checkOffset)
|
||||||
failParseWithErrorHandling();
|
failParseWithErrorHandling();
|
||||||
} catch (EndOfFileException e) {
|
} catch (EndOfFileException e) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue