/******************************************************************************* * Copyright (c) 2009 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.dom.lrparser.action.gnu; import java.util.List; import lpg.lpgjavaruntime.IToken; import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.core.dom.lrparser.action.AbstractParserAction; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParsersym; public class GNUBuildASTParserAction extends AbstractParserAction { private final INodeFactory nodeFactory; private final TokenMap tokenMap; public GNUBuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, INodeFactory nodeFactory) { super(parser, astStack); this.nodeFactory = nodeFactory; this.tokenMap = new TokenMap(GCCParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); } @Override protected IASTName createName(char[] image) { return nodeFactory.newName(image); } @Override protected boolean isCompletionToken(IToken token) { return tokenMap.mapKind(token.getKind()) == GCCParsersym.TK_Completion; } /** * Add support for GCC extended ASM declaration syntax. * * * asm_definition -- same as in C++ but its not in C99 spec so we put it here * ::= 'asm' '(' 'stringlit' ')' ';' * * extended_asm_declaration * ::= 'asm' 'volatile' '(' extended_asm_param_seq ')' ';' * | 'asm' '(' extended_asm_param_seq ')' ';' * */ public void consumeDeclarationASM() { List<IToken> tokens = stream.getRuleTokens(); int firstToken = 2; if(tokenMap.mapKind(tokens.get(1).getKind()) == GCCParsersym.TK_volatile) firstToken = 3; StringBuilder sb = new StringBuilder(); boolean first = true; for(IToken token : tokens.subList(firstToken, tokens.size()-2)) { if(!first) sb.append(' '); sb.append(token.toString()); first = false; } IASTASMDeclaration asm = nodeFactory.newASMDeclaration(sb.toString()); setOffsetAndLength(asm); astStack.push(asm); } /** * primary_expression * ::= '(' compound_statement ')' */ public void consumeCompoundStatementExpression() { IASTCompoundStatement compoundStatement = (IASTCompoundStatement) astStack.pop(); IGNUASTCompoundStatementExpression expr = nodeFactory.newGNUCompoundStatementExpression(compoundStatement); setOffsetAndLength(expr); astStack.push(expr); } }