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}