blob: 9c9c90d32c86bdcc10979598abeebfd28e9d1b55 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 University of Illinois at Urbana-Champaign and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* UIUC - Initial API and implementation
*******************************************************************************/
package org.eclipse.photran.internal.core.analysis.binding;
import java.util.List;
import org.eclipse.photran.internal.core.lexer.Token;
import org.eclipse.photran.internal.core.parser.ASTAllocatableStmtNode;
import org.eclipse.photran.internal.core.parser.ASTArrayAllocationNode;
import org.eclipse.photran.internal.core.parser.ASTArrayDeclaratorNode;
import org.eclipse.photran.internal.core.parser.ASTAsynchronousStmtNode;
import org.eclipse.photran.internal.core.parser.ASTBindStmtNode;
import org.eclipse.photran.internal.core.parser.ASTCommonBlockBinding;
import org.eclipse.photran.internal.core.parser.ASTDimensionStmtNode;
import org.eclipse.photran.internal.core.parser.ASTIntentParListNode;
import org.eclipse.photran.internal.core.parser.ASTIntentStmtNode;
import org.eclipse.photran.internal.core.parser.ASTNamedConstantDefNode;
import org.eclipse.photran.internal.core.parser.ASTOptionalParListNode;
import org.eclipse.photran.internal.core.parser.ASTOptionalStmtNode;
import org.eclipse.photran.internal.core.parser.ASTParameterStmtNode;
import org.eclipse.photran.internal.core.parser.ASTPointerStmtNode;
import org.eclipse.photran.internal.core.parser.ASTPointerStmtObjectNode;
import org.eclipse.photran.internal.core.parser.ASTProtectedStmtNode;
import org.eclipse.photran.internal.core.parser.ASTSaveStmtNode;
import org.eclipse.photran.internal.core.parser.ASTSavedEntityNode;
import org.eclipse.photran.internal.core.parser.ASTTargetObjectNode;
import org.eclipse.photran.internal.core.parser.ASTTargetStmtNode;
import org.eclipse.photran.internal.core.parser.ASTValueStmtNode;
import org.eclipse.photran.internal.core.parser.ASTVariableNameNode;
import org.eclipse.photran.internal.core.parser.ASTVolatileStmtNode;
import org.eclipse.photran.internal.core.parser.IASTListNode;
import org.eclipse.photran.internal.core.parser.IBindEntity;
import org.eclipse.photran.internal.core.vpg.PhotranTokenRef;
/**
* Phase 4 of name-binding analysis.
* <p>
* Visits specification statements in an AST, updating the corresponding
* {@link Definition} objects stored in the VPG.
*
* @author Jeff Overbey
* @see Binder
*/
class SpecificationCollector extends VisibilityCollector
{
// # R520
// <IntentStmt> ::=
// <LblDef> T_INTENT T_LPAREN <IntentSpec> T_RPAREN ( T_COLON T_COLON )? <IntentParList> T_EOS
//
// <IntentParList> ::=
// <IntentPar>
// | @:<IntentParList> T_COMMA <IntentPar>
//
// <IntentPar> ::=
// <DummyArgName>
@Override public void visitASTIntentStmtNode(ASTIntentStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTIntentParListNode> list = node.getVariableList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getVariableName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setIntent(node.getIntentSpec());
vpgProvider.setDefinitionFor(tr, def);
}
}
}
// # R521
// <OptionalStmt> ::=
// <LblDef> T_OPTIONAL ( T_COLON T_COLON )? <OptionalParList> T_EOS
//
// <OptionalParList> ::=
// <OptionalPar>
// | @:<OptionalParList> T_COMMA <OptionalPar>
//
// <OptionalPar> ::= <DummyArgName>
@Override public void visitASTOptionalStmtNode(ASTOptionalStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTOptionalParListNode> list = node.getVariableList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getVariableName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setOptional();
vpgProvider.setDefinitionFor(tr, def);
}
}
}
// # R524
// <SaveStmt> ::=
// <LblDef> T_SAVE T_EOS
// | <LblDef> T_SAVE ( T_COLON T_COLON )? <SavedEntityList> T_EOS
//
// # R525
// <SavedEntityList> ::=
// <SavedEntity>
// | @:<SavedEntityList> T_COMMA <SavedEntity>
//
// <SavedEntity> ::=
// <VariableName>
// | <SavedCommonBlock>
//
// <SavedCommonBlock> ::= T_SLASH <CommonBlockName> T_SLASH
@Override public void visitASTSaveStmtNode(ASTSaveStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTSavedEntityNode> list = node.getVariableList();
if (list == null) return;
for (int i = 0; i < list.size(); i++)
{
ASTSavedEntityNode entity = list.get(i);
if (entity.getVariableName() != null)
{
List<PhotranTokenRef> bindings = bind(entity.getVariableName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setSave();
vpgProvider.setDefinitionFor(tr, def);
}
}
else if (entity.getCommonBlockName() != null)
{
List<PhotranTokenRef> bindings = bind(entity.getCommonBlockName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setSave();
vpgProvider.setDefinitionFor(tr, def);
}
}
}
}
// # R526
// <DimensionStmt> ::=
// <LblDef> T_DIMENSION ( T_COLON T_COLON )? <ArrayDeclaratorList> T_EOS
//
// <ArrayDeclaratorList> ::=
// <ArrayDeclarator>
// | @:<ArrayDeclaratorList> T_COMMA <ArrayDeclarator>
//
// <ArrayDeclarator> ::= <VariableName> T_LPAREN <ArraySpec> T_RPAREN
@Override public void visitASTDimensionStmtNode(final ASTDimensionStmtNode node)
{
super.traverseChildren(node);
final IASTListNode<ASTArrayDeclaratorNode> decls = node.getArrayDeclaratorList();
for (int i = 0; i < decls.size(); i++)
{
List<PhotranTokenRef> bindings = bind(decls.get(i).getVariableName());
try
{
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setArraySpec(decls.get(i).getArraySpec());
vpgProvider.setDefinitionFor(tr, def);
}
}
catch (Exception e)
{
throw new Error(e);
}
}
}
// # R527
// <AllocatableStmt> ::=
// <LblDef> T_ALLOCATABLE ( T_COLON T_COLON )? <ArrayAllocationList> T_EOS
//
// <ArrayAllocationList> ::=
// <ArrayAllocation>
// | @:<ArrayAllocationList> T_COMMA <ArrayAllocation>
//
// <ArrayAllocation> ::=
// <ArrayName>
// | <ArrayName> T_LPAREN <DeferredShapeSpecList> T_RPAREN
@Override public void visitASTAllocatableStmtNode(ASTAllocatableStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTArrayAllocationNode> list = node.getArrayAllocationList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getArrayName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setAllocatable();
vpgProvider.setDefinitionFor(tr, def);
}
}
}
// # R528 /* <ObjectName> renamed to <PointerName> to simplify Sem. Anal. */
// <PointerStmt> ::=
// <LblDef> T_POINTER ( T_COLON T_COLON )? <PointerStmtObjectList> T_EOS
//
// <PointerStmtObjectList> ::=
// <PointerStmtObject>
// | @:<PointerStmtObjectList> T_COMMA <PointerStmtObject>
//
// <PointerStmtObject> ::=
// <PointerName>
// | <PointerName> T_LPAREN <DeferredShapeSpecList> T_RPAREN
//
// <PointerName> ::= T_IDENT
@Override public void visitASTPointerStmtNode(ASTPointerStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTPointerStmtObjectNode> list = node.getPointerStmtObjectList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getPointerName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setPointer();
vpgProvider.setDefinitionFor(tr, def);
}
}
}
//
//
// # R529 /* <ObjectName> renamed to <TargetName> to simplify Sem. Anal. */
// <TargetStmt> ::=
// <LblDef> T_TARGET ( T_COLON T_COLON )? <TargetObjectList> T_EOS
//
// <TargetObjectList> ::=
// <TargetObject>
// | @:<TargetObjectList> T_COMMA <TargetObject>
//
// <TargetObject> ::=
// <TargetName>
// | <TargetName> T_LPAREN <ArraySpec> T_RPAREN
//
// <TargetName> ::= T_IDENT
@Override public void visitASTTargetStmtNode(ASTTargetStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTTargetObjectNode> list = node.getTargetObjectList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getTargetName());
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setTarget();
vpgProvider.setDefinitionFor(tr, def);
}
}
}
// # R530
// <ParameterStmt> ::=
// <LblDef> T_PARAMETER T_LPAREN <NamedConstantDefList> T_RPAREN T_EOS
//
// # R531
// <NamedConstantDefList> ::=
// <NamedConstantDef>
// | @:<NamedConstantDefList> T_COMMA <NamedConstantDef>
//
// <NamedConstantDef> ::= <NamedConstant> T_EQUALS <Expr>
@Override public void visitASTParameterStmtNode(ASTParameterStmtNode node)
{
super.traverseChildren(node);
IASTListNode<ASTNamedConstantDefNode> list = node.getNamedConstantDefList();
for (int i = 0; i < list.size(); i++)
{
List<PhotranTokenRef> bindings = bind(list.get(i).getNamedConstant());
try
{
for (PhotranTokenRef tr : bindings)
{
Definition def = vpg.getDefinitionFor(tr);
def.setParameter();
vpgProvider.setDefinitionFor(tr, def);
}
}
catch (Exception e)
{
throw new Error(e);
}
}
}
// F03
@Override public void visitASTAsynchronousStmtNode(ASTAsynchronousStmtNode node)
{
super.traverseChildren(node);
IASTListNode<Token> list = node.getObjectList();
for (int i = 0; i < list.size(); i++)
bind(list.get(i));
}
// F03
@Override public void visitASTBindStmtNode(ASTBindStmtNode node)
{
super.traverseChildren(node);
IASTListNode<IBindEntity> list = node.getBindEntityList();
for (int i = 0; i < list.size(); i++)
{
IBindEntity entity = list.get(i);
if (entity instanceof ASTCommonBlockBinding)
bind(((ASTCommonBlockBinding)entity).getCommonBlockName());
else
bind(((ASTVariableNameNode)entity).getVariableName());
}
}
// F03
@Override public void visitASTProtectedStmtNode(ASTProtectedStmtNode node)
{
super.traverseChildren(node);
IASTListNode<Token> list = node.getEntityNameList();
for (int i = 0; i < list.size(); i++)
bind(list.get(i));
}
// F03
@Override public void visitASTValueStmtNode(ASTValueStmtNode node)
{
super.traverseChildren(node);
IASTListNode<Token> list = node.getEntityNameList();
for (int i = 0; i < list.size(); i++)
bind(list.get(i));
}
// F03
@Override public void visitASTVolatileStmtNode(ASTVolatileStmtNode node)
{
super.traverseChildren(node);
IASTListNode<Token> list = node.getEntityNameList();
for (int i = 0; i < list.size(); i++)
bind(list.get(i));
}
}