001/*-------------------------------------------------------------------------+
002|                                                                          |
003| Copyright (c) 2009-2017 CQSE GmbH                                        |
004|                                                                          |
005+-------------------------------------------------------------------------*/
006package eu.cqse.check.framework.shallowparser.languages.cobol;
007
008import java.util.List;
009
010import eu.cqse.check.framework.scanner.ETokenType;
011import eu.cqse.check.framework.scanner.IToken;
012import eu.cqse.check.framework.shallowparser.framework.ParserState;
013import eu.cqse.check.framework.shallowparser.framework.RecognizerBase;
014
015/**
016 * For Cobol scope statements with conditional clauses (e.g. WRITE), this
017 * recognizer helps to tell if the next token type is an explicit scope
018 * terminator or not.
019 */
020public class ConditionalClauseWithEndScopeRecognizer extends RecognizerBase<ECobolParserState> {
021
022        /** Expected end token */
023        private ETokenType expectedEndToken;
024
025        /** Constructor. */
026        public ConditionalClauseWithEndScopeRecognizer(ETokenType endToken) {
027                this.expectedEndToken = endToken;
028        }
029
030        /** {@inheritDoc} */
031        @Override
032        protected int matchesLocally(ParserState<ECobolParserState> parserState, List<IToken> tokens, int startOffset) {
033                if (tokens.size() == startOffset) {
034                        return NO_MATCH;
035                }
036
037                if (tokens.get(startOffset).getType() == expectedEndToken) {
038                        return super.matchesLocally(parserState, tokens, startOffset);
039                }
040
041                return NO_MATCH;
042        }
043
044}