001/*-------------------------------------------------------------------------+ 002| | 003| Copyright 2005-2011 the ConQAT Project | 004| | 005| Licensed under the Apache License, Version 2.0 (the "License"); | 006| you may not use this file except in compliance with the License. | 007| You may obtain a copy of the License at | 008| | 009| http://www.apache.org/licenses/LICENSE-2.0 | 010| | 011| Unless required by applicable law or agreed to in writing, software | 012| distributed under the License is distributed on an "AS IS" BASIS, | 013| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 014| See the License for the specific language governing permissions and | 015| limitations under the License. | 016+-------------------------------------------------------------------------*/ 017package eu.cqse.check.framework.shallowparser.languages.cpp; 018 019import static eu.cqse.check.framework.scanner.ETokenType.LT; 020 021import java.util.List; 022 023import eu.cqse.check.framework.scanner.IToken; 024import eu.cqse.check.framework.shallowparser.framework.ParserState; 025import eu.cqse.check.framework.shallowparser.framework.RecognizerBase; 026import eu.cqse.check.framework.shallowparser.languages.base.EGenericParserStates; 027import eu.cqse.check.framework.util.LanguageFeatureParser; 028 029/** 030 * A recognizer that skips the angle brackets of a template. A simple skip 031 * nested recognizer cannot be used, because of constructs like 032 * "std::vector<SomeType<(1>2)>> x". 033 */ 034public class CppSkipTemplateSpecificationRecognizer extends RecognizerBase<EGenericParserStates> { 035 036 /** {@inheritDoc} */ 037 @Override 038 protected int matchesLocally(ParserState<EGenericParserStates> parserState, List<IToken> tokens, int startOffset) { 039 // there must be at least two tokens in order to match, namely opening 040 // and closing angle bracket 041 if (startOffset >= tokens.size() - 1 || tokens.get(startOffset).getType() != LT) { 042 return NO_MATCH; 043 } 044 045 int offset = LanguageFeatureParser.CPP.skipGeneric(tokens, startOffset); 046 if (offset < 0) { 047 return NO_MATCH; 048 } 049 return offset + 1; 050 } 051}