CIVLPragmaHandler.java

package edu.udel.cis.vsl.abc.front.c.astgen;

import java.util.List;

import edu.udel.cis.vsl.abc.ast.node.IF.ASTNode;
import edu.udel.cis.vsl.abc.ast.node.IF.NodeFactory;
import edu.udel.cis.vsl.abc.ast.node.IF.PragmaNode;
import edu.udel.cis.vsl.abc.ast.node.IF.statement.BlockItemNode;
import edu.udel.cis.vsl.abc.front.IF.Front;
import edu.udel.cis.vsl.abc.front.IF.ParseException;
import edu.udel.cis.vsl.abc.front.IF.ParseTree;
import edu.udel.cis.vsl.abc.front.c.parse.CParser;
import edu.udel.cis.vsl.abc.front.c.parse.CParser.RuleKind;
import edu.udel.cis.vsl.abc.front.common.astgen.PragmaHandler;
import edu.udel.cis.vsl.abc.front.common.astgen.SimpleScope;
import edu.udel.cis.vsl.abc.token.IF.CivlcTokenSource;
import edu.udel.cis.vsl.abc.token.IF.Source;
import edu.udel.cis.vsl.abc.token.IF.SyntaxException;

public class CIVLPragmaHandler extends PragmaHandler {

	private NodeFactory nodeFactory;

	private CParser parser;

	private ParseTree parseTree;

	CASTBuilderWorker worker;

	public CIVLPragmaHandler(CASTBuilder builder, ParseTree parseTree) {
		this.nodeFactory = builder.getASTFactory().getNodeFactory();
		this.parseTree = parseTree;
		this.worker = builder.getWorker(parseTree);
		this.parser = (CParser) Front.newParser(parseTree.getLanguage());
	}

	@Override
	public EntityKind getEntityKind() {
		return EntityKind.PRAGMA_HANDLER;
	}

	@Override
	public String getName() {
		return "CIVL";
	}

	@Override
	public ASTNode processPragmaNode(PragmaNode pragmaNode, SimpleScope scope)
			throws SyntaxException, ParseException {
		CivlcTokenSource tokens = pragmaNode.newTokenSource();
		Source source = pragmaNode.getSource();
		ParseTree pragmaTree = parser.parse(RuleKind.BLOCK_ITEM, tokens,
				scope.getScopeSymbolStack());
		List<BlockItemNode> blockList = worker.translateBlockItem(
				pragmaTree.getRoot(), scope);

		return blockList.size() == 1 ? blockList.get(0) : nodeFactory
				.newCompoundStatementNode(source, blockList);
	}

	@Override
	public ParseTree getParseTree() {
		return parseTree;
	}

}