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.IToken;
011import eu.cqse.check.framework.shallowparser.framework.ParserState;
012import eu.cqse.check.framework.shallowparser.framework.RecognizerBase;
013
014/**
015 * Paragraph recognizer completes detection of labels or paragraphs to which
016 * executions can jump to. Usually labels begin on a separate line.
017 */
018public class ParagraphRecognizer extends RecognizerBase<ECobolParserState> {
019
020        /** {@inheritDoc} */
021        @Override
022        protected int matchesLocally(ParserState<ECobolParserState> parserState, List<IToken> tokens, int startOffset) {
023                int tokenBeforeLabelStartIndex = startOffset - 3;
024                if (tokenBeforeLabelStartIndex < 0) {
025                        return super.matchesLocally(parserState, tokens, startOffset);
026                }
027
028                int labelLineNumber = tokens.get(startOffset - 2).getLineNumber();
029                int dotLineNumber = tokens.get(startOffset - 1).getLineNumber();
030                if (labelLineNumber == dotLineNumber
031                                && labelLineNumber != tokens.get(tokenBeforeLabelStartIndex).getLineNumber()) {
032                        return startOffset;
033                }
034
035                return NO_MATCH;
036        }
037}