Issue #49. Added ANTLR4 grammar for parsing Javadoc comments.

This commit is contained in:
Baratali Izmailov 2014-10-19 21:32:11 +04:00
parent 266ec7fc97
commit 185e730e93
5 changed files with 1606 additions and 3 deletions

31
pom.xml Normal file → Executable file
View File

@ -160,6 +160,11 @@
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.3</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
@ -287,7 +292,7 @@
</executions>
</plugin>
<!-- Generate the grammar -->
<!-- Generate the ANTLRv2 grammar -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>antlr-maven-plugin</artifactId>
@ -304,6 +309,25 @@
</execution>
</executions>
</plugin>
<!-- Generate the ANTLRv4 grammar -->
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>4.3</version>
<configuration>
<visitor>true</visitor>
<sourceDirectory>${basedir}/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc</sourceDirectory>
<outputDirectory>${project.build.directory}/generated-sources/antlr/com/puppycrawl/tools/checkstyle/grammars/javadoc</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
@ -319,14 +343,15 @@
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/antlr/</source>
<source>${project.build.directory}/generated-sources/antlr/javadoc</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<!-- Generate checkstylecompilation.properties -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
@ -637,7 +662,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>checkstyle_checks.xml</configLocation>
<configLocation>${project.build.directory}/checkstyle_checks.xml</configLocation>
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
<suppressionsLocation>suppressions.xml</suppressionsLocation>
<headerLocation>java.header</headerLocation>

View File

@ -0,0 +1,264 @@
////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2014 Oliver Burn
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.api;
import com.puppycrawl.tools.checkstyle.grammars.javadoc.JavadocParser;
public final class JavadocTokenTypes
{
private static final int mRuleTypesOffset = 10000;
// root node
public static final int JAVADOC = JavadocParser.RULE_javadoc + mRuleTypesOffset;
//--------------------------------------------------------------------------------------------//
//------------------ JAVADOC TAGS --------------------------------------------//
//--------------------------------------------------------------------------------------------//
public static final int JAVADOC_TAG = JavadocParser.RULE_javadocTag + mRuleTypesOffset;
public static final int JAVADOC_INLINE_TAG = JavadocParser.RULE_javadocInlineTag + mRuleTypesOffset;
public static final int RETURN_LITERAL = JavadocParser.RETURN_LITERAL;
public static final int DEPRECATED_LITERAL = JavadocParser.DEPRECATED_LITERAL;
public static final int SINCE_LITERAL = JavadocParser.SINCE_LITERAL;
public static final int SERIAL_DATA_LITERAL = JavadocParser.SERIAL_DATA_LITERAL;
public static final int SERIAL_FIELD_LITERAL = JavadocParser.SERIAL_FIELD_LITERAL;
public static final int PARAM_LITERAL = JavadocParser.PARAM_LITERAL;
public static final int SEE_LITERAL = JavadocParser.SEE_LITERAL;
public static final int SERIAL_LITERAL = JavadocParser.SERIAL_LITERAL;
public static final int VERSION_LITERAL = JavadocParser.VERSION_LITERAL;
public static final int CUSTOM_NAME = JavadocParser.CUSTOM_NAME;
public static final int EXCEPTION_LITERAL = JavadocParser.EXCEPTION_LITERAL;
public static final int THROWS_LITERAL = JavadocParser.THROWS_LITERAL;
public static final int AUTHOR_LITERAL = JavadocParser.AUTHOR_LITERAL;
public static final int JAVADOC_INLINE_TAG_START = JavadocParser.JAVADOC_INLINE_TAG_START; // '{'
public static final int JAVADOC_INLINE_TAG_END = JavadocParser.JAVADOC_INLINE_TAG_END; // '}'
public static final int CODE_LITERAL = JavadocParser.CODE_LITERAL;
public static final int DOC_ROOT_LITERAL = JavadocParser.DOC_ROOT_LITERAL;
public static final int LINK_LITERAL = JavadocParser.LINK_LITERAL;
public static final int INHERIT_DOC_LITERAL = JavadocParser.INHERIT_DOC_LITERAL;
public static final int LINKPLAIN_LITERAL = JavadocParser.LINKPLAIN_LITERAL;
public static final int LITERAL_LITERAL = JavadocParser.LITERAL_LITERAL; // @literal
public static final int VALUE_LITERAL = JavadocParser.VALUE_LITERAL;
// @see and {@link} argument
public static final int REFERENCE = JavadocParser.RULE_reference + mRuleTypesOffset;
// @see and {@link} reference components
public static final int PACKAGE = JavadocParser.PACKAGE;
public static final int CLASS = JavadocParser.CLASS;
public static final int DOT = JavadocParser.DOT;
public static final int HASH = JavadocParser.HASH; // #
public static final int MEMBER = JavadocParser.MEMBER;
public static final int PARAMETERS = JavadocParser.RULE_parameters + mRuleTypesOffset; // parent node for LEFT_BRACE, RIGHT_BRACE, ARGUMENT, COMMA nodes
public static final int LEFT_BRACE = JavadocParser.LEFT_BRACE;
public static final int RIGHT_BRACE = JavadocParser.RIGHT_BRACE;
public static final int ARGUMENT = JavadocParser.ARGUMENT;
public static final int COMMA = JavadocParser.COMMA;
// @see and {@link} argument
public static final int STRING = JavadocParser.STRING; // "text"
// description argument for many Javadoc tags
public static final int DESCRIPTION = JavadocParser.RULE_description + mRuleTypesOffset;
// First argument of @exception: @exception class-name description
public static final int CLASS_NAME = JavadocParser.CLASS_NAME;
// First argument of @param: @param parameter-name description
public static final int PARAMETER_NAME = JavadocParser.PARAMETER_NAME;
// @serial and @serialField arguments
public static final int LITERAL_EXCLUDE = JavadocParser.LITERAL_EXCLUDE;
public static final int LITERAL_INCLUDE = JavadocParser.LITERAL_INCLUDE;
public static final int FIELD_NAME = JavadocParser.FIELD_NAME;
public static final int FIELD_TYPE = JavadocParser.FIELD_TYPE;
//--------------------------------------------------------------------------------------------//
//------------------ HTML TAGS -----------------------------------------------//
//--------------------------------------------------------------------------------------------//
public static final int HTML_ELEMENT = JavadocParser.RULE_htmlElement + mRuleTypesOffset; // parent node for all html tags
public static final int HTML_ELEMENT_OPEN = JavadocParser.RULE_htmlElementOpen + mRuleTypesOffset + mRuleTypesOffset; // <XXX>
public static final int HTML_ELEMENT_CLOSE = JavadocParser.RULE_htmlElementClose + mRuleTypesOffset; // </XXX>
public static final int HTML_TAG = JavadocParser.RULE_htmlTag + mRuleTypesOffset; // non-special HTML tag
public static final int HTML_TAG_NAME = JavadocParser.HTML_TAG_NAME; // identifier inside HTML tag: tag name or attribute name
public static final int ATTRIBUTE = JavadocParser.RULE_attribute + mRuleTypesOffset + mRuleTypesOffset; // html tag attribute. Parent node for: HTML_TAG_IDENT, EQUALS, ATTR_VALUE
// HTML tag components
public static final int OPEN = JavadocParser.OPEN; // '<'
public static final int SLASH = JavadocParser.SLASH; // '/'
public static final int CLOSE = JavadocParser.CLOSE; // '>'
public static final int SLASH_CLOSE = JavadocParser.SLASH_CLOSE; // '/>'
public static final int EQUALS = JavadocParser.EQUALS; // '='
public static final int ATTR_VALUE = JavadocParser.ATTR_VALUE; // attribute value
/////////////////////// HTML TAGS WITH OPTIONAL CLOSE TAG /////////////////////////////////////
public static final int PARAGRAPH = JavadocParser.RULE_paragraph + mRuleTypesOffset;
public static final int P_TAG_OPEN = JavadocParser.RULE_pTagOpen + mRuleTypesOffset;
public static final int P_TAG_CLOSE = JavadocParser.RULE_pTagClose + mRuleTypesOffset;
public static final int P_HTML_TAG_NAME = JavadocParser.P_HTML_TAG_NAME;
public static final int LI = JavadocParser.RULE_li + mRuleTypesOffset;
public static final int LI_TAG_OPEN = JavadocParser.RULE_liTagOpen + mRuleTypesOffset;
public static final int LI_TAG_CLOSE = JavadocParser.RULE_liTagClose + mRuleTypesOffset;
public static final int LI_HTML_TAG_NAME = JavadocParser.LI_HTML_TAG_NAME;
public static final int TR = JavadocParser.RULE_tr + mRuleTypesOffset;
public static final int TR_TAG_OPEN = JavadocParser.RULE_trTagOpen + mRuleTypesOffset;
public static final int TR_TAG_CLOSE = JavadocParser.RULE_trTagClose + mRuleTypesOffset;
public static final int TR_HTML_TAG_NAME = JavadocParser.TR_HTML_TAG_NAME;
public static final int TD = JavadocParser.RULE_td + mRuleTypesOffset;
public static final int TD_TAG_OPEN = JavadocParser.RULE_tdTagOpen + mRuleTypesOffset;
public static final int TD_TAG_CLOSE = JavadocParser.RULE_tdTagClose + mRuleTypesOffset;
public static final int TD_HTML_TAG_NAME = JavadocParser.TD_HTML_TAG_NAME;
public static final int TH = JavadocParser.RULE_th + mRuleTypesOffset;
public static final int TH_TAG_OPEN = JavadocParser.RULE_thTagOpen + mRuleTypesOffset;
public static final int TH_TAG_CLOSE = JavadocParser.RULE_thTagClose + mRuleTypesOffset;
public static final int TH_HTML_TAG_NAME = JavadocParser.TH_HTML_TAG_NAME;
public static final int BODY = JavadocParser.RULE_body + mRuleTypesOffset;
public static final int BODY_TAG_OPEN = JavadocParser.RULE_bodyTagOpen + mRuleTypesOffset;
public static final int BODY_TAG_CLOSE = JavadocParser.RULE_bodyTagClose + mRuleTypesOffset;
public static final int BODY_HTML_TAG_NAME = JavadocParser.BODY_HTML_TAG_NAME;
public static final int COLGROUP = JavadocParser.RULE_colgroup + mRuleTypesOffset;
public static final int COLGROUP_TAG_OPEN = JavadocParser.RULE_colgroupTagOpen + mRuleTypesOffset;
public static final int COLGROUP_TAG_CLOSE = JavadocParser.RULE_colgroupTagClose + mRuleTypesOffset;
public static final int COLGROUP_HTML_TAG_NAME = JavadocParser.COLGROUP_HTML_TAG_NAME;
public static final int DD = JavadocParser.RULE_dd + mRuleTypesOffset;
public static final int DD_TAG_OPEN = JavadocParser.RULE_ddTagOpen + mRuleTypesOffset;
public static final int DD_TAG_CLOSE = JavadocParser.RULE_ddTagClose + mRuleTypesOffset;
public static final int DD_HTML_TAG_NAME = JavadocParser.DD_HTML_TAG_NAME;
public static final int DT = JavadocParser.RULE_dt + mRuleTypesOffset;
public static final int DT_TAG_OPEN = JavadocParser.RULE_dtTagOpen + mRuleTypesOffset;
public static final int DT_TAG_CLOSE = JavadocParser.RULE_dtTagClose + mRuleTypesOffset;
public static final int DT_HTML_TAG_NAME = JavadocParser.DT_HTML_TAG_NAME;
public static final int HEAD = JavadocParser.RULE_head + mRuleTypesOffset;
public static final int HEAD_TAG_OPEN = JavadocParser.RULE_headTagOpen + mRuleTypesOffset;
public static final int HEAD_TAG_CLOSE = JavadocParser.RULE_headTagClose + mRuleTypesOffset;
public static final int HEAD_HTML_TAG_NAME = JavadocParser.HEAD_HTML_TAG_NAME;
public static final int HTML = JavadocParser.RULE_html + mRuleTypesOffset;
public static final int HTML_TAG_OPEN = JavadocParser.RULE_htmlTagOpen + mRuleTypesOffset;
public static final int HTML_TAG_CLOSE = JavadocParser.RULE_htmlTagClose + mRuleTypesOffset;
public static final int HTML_HTML_TAG_NAME = JavadocParser.HTML_HTML_TAG_NAME;
public static final int OPTION = JavadocParser.RULE_option + mRuleTypesOffset;
public static final int OPTION_TAG_OPEN = JavadocParser.RULE_optionTagOpen + mRuleTypesOffset;
public static final int OPTION_TAG_CLOSE = JavadocParser.RULE_optionTagClose + mRuleTypesOffset;
public static final int OPTION_HTML_TAG_NAME = JavadocParser.OPTION_HTML_TAG_NAME;
public static final int TBODY = JavadocParser.RULE_tbody + mRuleTypesOffset;
public static final int TBODY_TAG_OPEN = JavadocParser.RULE_tbodyTagOpen + mRuleTypesOffset;
public static final int TBODY_TAG_CLOSE = JavadocParser.RULE_tbodyTagClose + mRuleTypesOffset;
public static final int TBODY_HTML_TAG_NAME = JavadocParser.TBODY_HTML_TAG_NAME;
public static final int TFOOT = JavadocParser.RULE_tfoot + mRuleTypesOffset;
public static final int TFOOT_TAG_OPEN = JavadocParser.RULE_tfootTagOpen + mRuleTypesOffset;
public static final int TFOOT_TAG_CLOSE = JavadocParser.RULE_tfootTagClose + mRuleTypesOffset;
public static final int TFOOT_HTML_TAG_NAME = JavadocParser.TFOOT_HTML_TAG_NAME;
public static final int THEAD = JavadocParser.RULE_thead + mRuleTypesOffset;
public static final int THEAD_TAG_OPEN = JavadocParser.RULE_theadTagOpen + mRuleTypesOffset;
public static final int THEAD_TAG_CLOSE = JavadocParser.RULE_theadTagClose + mRuleTypesOffset;
public static final int THEAD_HTML_TAG_NAME = JavadocParser.THEAD_HTML_TAG_NAME;
///////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////// SINGLETON HTML TAGS //////////////////////////////////////////////////
public static final int SINGLETON_ELEMENT = JavadocParser.RULE_singletonElement + mRuleTypesOffset; // parent node for all singleton tags
public static final int SINGLETON_TAG = JavadocParser.RULE_singletonTag + mRuleTypesOffset; // non-special singleton tag
public static final int AREA_TAG = JavadocParser.RULE_areaTag + mRuleTypesOffset;
public static final int AREA_HTML_TAG_NAME = JavadocParser.AREA_HTML_TAG_NAME;
public static final int BASE_TAG = JavadocParser.RULE_baseTag + mRuleTypesOffset;
public static final int BASE_HTML_TAG_NAME = JavadocParser.BASE_HTML_TAG_NAME;
public static final int BASEFRONT_TAG = JavadocParser.RULE_basefrontTag + mRuleTypesOffset;
public static final int BASEFRONT_HTML_TAG_NAME = JavadocParser.BASEFRONT_HTML_TAG_NAME;
public static final int BR_TAG = JavadocParser.RULE_brTag + mRuleTypesOffset;
public static final int BR_HTML_TAG_NAME = JavadocParser.BR_HTML_TAG_NAME;
public static final int COL_TAG = JavadocParser.RULE_colTag + mRuleTypesOffset;
public static final int COL_HTML_TAG_NAME = JavadocParser.COL_HTML_TAG_NAME;
public static final int FRAME_TAG = JavadocParser.RULE_frameTag + mRuleTypesOffset;
public static final int FRAME_HTML_TAG_NAME = JavadocParser.FRAME_HTML_TAG_NAME;
public static final int HR_TAG = JavadocParser.RULE_hrTag + mRuleTypesOffset;
public static final int HR_HTML_TAG_NAME = JavadocParser.HR_HTML_TAG_NAME;
public static final int IMG_TAG = JavadocParser.RULE_imgTag + mRuleTypesOffset;
public static final int IMG_HTML_TAG_NAME = JavadocParser.IMG_HTML_TAG_NAME;
public static final int INPUT_TAG = JavadocParser.RULE_inputTag + mRuleTypesOffset;
public static final int INPUT_HTML_TAG_NAME = JavadocParser.INPUT_HTML_TAG_NAME;
public static final int ISINDEX_TAG = JavadocParser.RULE_isindexTag + mRuleTypesOffset;
public static final int ISINDEX_HTML_TAG_NAME = JavadocParser.ISINDEX_HTML_TAG_NAME;
public static final int LINK_TAG = JavadocParser.RULE_linkTag + mRuleTypesOffset;
public static final int LINK_HTML_TAG_NAME = JavadocParser.LINK_HTML_TAG_NAME;
public static final int META_TAG = JavadocParser.RULE_metaTag + mRuleTypesOffset;
public static final int META_HTML_TAG_NAME = JavadocParser.META_HTML_TAG_NAME;
public static final int PARAM_TAG = JavadocParser.RULE_paramTag + mRuleTypesOffset;
public static final int PARAM_HTML_TAG_NAME = JavadocParser.PARAM_HTML_TAG_NAME;
///////////////////////////////////////////////////////////////////////////////////////////////
// HTML comments
public static final int HTML_COMMENT = JavadocParser.RULE_htmlComment + mRuleTypesOffset + mRuleTypesOffset;
public static final int HTML_COMMENT_START = JavadocParser.HTML_COMMENT_START; // <!---
public static final int HTML_COMMENT_END = JavadocParser.HTML_COMMENT_END; // -->
public static final int CDATA = JavadocParser.CDATA; // '<![CDATA[...]]>'
//--------------------------------------------------------------------------------------------//
//------------------ OTHER ---------------------------------------------------//
//--------------------------------------------------------------------------------------------//
public static final int LEADING_ASTERISK = JavadocParser.LEADING_ASTERISK;
public static final int NEWLINE = JavadocParser.NEWLINE; // \n
public static final int CHAR = JavadocParser.CHAR; // any symbol
public static final int WS = JavadocParser.WS; // whitespace, \t
public static final int TEXT = JavadocParser.RULE_text + mRuleTypesOffset; // CHAR and WS sequence
public static final int EOF = JavadocParser.EOF; // end of file
private JavadocTokenTypes()
{
}
}

View File

@ -0,0 +1,404 @@
lexer grammar JavadocLexer;
@lexer::header {
package com.puppycrawl.tools.checkstyle.grammars.javadoc;
import java.util.*;
}
@lexer::members {
boolean recognizeXmlTags = true;
boolean isJavadocTagAvailable = true;
int insideJavadocInlineTag = 0;
boolean insidePreTag = false;
boolean referenceCatched = false;
boolean insideReferenceArguments = false;
boolean htmlTagNameCatched = false;
boolean attributeCatched = false;
int previousTokenType = 0;
int previousToPreviousTokenType = 0;
public void emit(Token token) {
super.emit(token);
previousToPreviousTokenType = previousTokenType;
previousTokenType = token.getType();
if (previousTokenType == NEWLINE) {
isJavadocTagAvailable = true;
} else if (previousTokenType != WS && previousTokenType != LEADING_ASTERISK) {
isJavadocTagAvailable = false;
}
}
public void skipCurrentTokenConsuming() {
_input.seek(_input.index() - 1);
}
}
LEADING_ASTERISK : ( (' '|'\t') {_tokenStartCharPositionInLine == 0}? ) (' '|'\t')* '*'
| '*' {_tokenStartCharPositionInLine == 0}?
;
HTML_COMMENT_START : '<!--' {recognizeXmlTags}?
-> pushMode(htmlComment)
;
CDATA : '<![CDATA[' .*? ']]>' {recognizeXmlTags}?;
WS : (' '|'\t')+ ;
OPEN: '<' {recognizeXmlTags && (Character.isLetter(_input.LA(1)) || _input.LA(1) == '/')}?
-> pushMode(xmlTagDefinition)
;
//PRE_TAG_OPEN: ('<pre>' | '<PRE>') {!insidePreTag}?
// {insidePreTag=true; recognizeXmlTags=false;}
// ;
//PRE_TAG_CLOSE: ('</pre>' | '</PRE>') {insidePreTag}?
// {insidePreTag=false; recognizeXmlTags=true;}
// ;
NEWLINE: '\n';
AUTHOR_LITERAL : '@author' {isJavadocTagAvailable}?;
DEPRECATED_LITERAL : '@deprecated' {isJavadocTagAvailable}?;
EXCEPTION_LITERAL : '@exception' {isJavadocTagAvailable}? -> pushMode(exception);
PARAM_LITERAL : '@param' {isJavadocTagAvailable}? -> pushMode(param);
RETURN_LITERAL : '@return' {isJavadocTagAvailable}?;
SEE_LITERAL : '@see' {isJavadocTagAvailable}? -> pushMode(seeLink);
SERIAL_LITERAL : '@serial' {isJavadocTagAvailable}?;
SERIAL_FIELD_LITERAL : '@serialField' {isJavadocTagAvailable}? -> pushMode(serialField);
SERIAL_DATA_LITERAL : '@serialData' {isJavadocTagAvailable}?;
SINCE_LITERAL : '@since' {isJavadocTagAvailable}?;
THROWS_LITERAL : '@throws' {isJavadocTagAvailable}? -> pushMode(exception);
VERSION_LITERAL : '@version' {isJavadocTagAvailable}?;
JAVADOC_INLINE_TAG_START: '{' {_input.LA(1) == '@'}? {insideJavadocInlineTag++;} -> pushMode(javadocInlineTag);
JAVADOC_INLINE_TAG_END: '}' {insideJavadocInlineTag>0}?
{insideJavadocInlineTag--; recognizeXmlTags=true;}
;
CUSTOM_NAME: '@' [a-zA-Z0-9]+ {isJavadocTagAvailable}?;
LITERAL_INCLUDE: 'include' {previousToPreviousTokenType==SERIAL_LITERAL}?;
LITERAL_EXCLUDE: 'exclude' {previousToPreviousTokenType==SERIAL_LITERAL}?;
CHAR : . ;
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// JAVADOC TAG MODES ///////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
mode param;
Space0: WS -> type(WS);
PARAMETER_NAME: [a-zA-Z0-9<>_-]+ -> mode(DEFAULT_MODE);
Char1: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode seeLink;
Space1: WS
{
if (referenceCatched) {
_mode = DEFAULT_MODE;
referenceCatched = false;
}
}
-> type(WS);
Newline5: NEWLINE
{
if (referenceCatched) {
_mode = DEFAULT_MODE;
referenceCatched = false;
}
}
-> type(NEWLINE);
Leading_asterisk3: LEADING_ASTERISK -> type(LEADING_ASTERISK);
XmlTagOpen1: '<' -> type(OPEN), pushMode(xmlTagDefinition);
STRING: '"' .*? '"' {referenceCatched = false;} -> mode(DEFAULT_MODE);
PACKAGE: [a-z] ([a-z_-] | '.')+ [a-z_-] {referenceCatched = true;};
DOT: '.';
HASH: '#' {referenceCatched = true;} -> mode(classMemeber);
CLASS: [A-Z] [a-zA-Z0-9_-]* {referenceCatched = true;};
End20: JAVADOC_INLINE_TAG_END
{
insideJavadocInlineTag--;
recognizeXmlTags=true;
referenceCatched = false;
}
-> type(JAVADOC_INLINE_TAG_END), mode(DEFAULT_MODE)
;
// exit from 'seeLink' mode without consuming current character
Char2: .
{
skipCurrentTokenConsuming();
referenceCatched = false;
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode classMemeber;
MEMBER: [a-zA-Z0-9_-]+ {!insideReferenceArguments}?;
LEFT_BRACE: '(' {insideReferenceArguments=true;};
RIGHT_BRACE: ')' {insideReferenceArguments=false;};
ARGUMENT: ([a-zA-Z0-9_-] | '.' | '[' | ']')+ {insideReferenceArguments}?;
COMMA: ',' {insideReferenceArguments}?;
Leading_asterisk6: LEADING_ASTERISK
{
if (!insideReferenceArguments) {
_mode = DEFAULT_MODE;
insideReferenceArguments = false;
referenceCatched = false;
}
} -> type(LEADING_ASTERISK);
Newline7: NEWLINE
{
if (!insideReferenceArguments) {
_mode = DEFAULT_MODE;
insideReferenceArguments = false;
referenceCatched = false;
}
} -> type(NEWLINE);
Space20: WS
{
if (!insideReferenceArguments) {
_mode = DEFAULT_MODE;
insideReferenceArguments = false;
referenceCatched = false;
}
} -> type(WS);
End2: JAVADOC_INLINE_TAG_END
{
insideJavadocInlineTag--;
recognizeXmlTags=true;
referenceCatched = false;
insideReferenceArguments = false;
}
-> type(JAVADOC_INLINE_TAG_END), mode(DEFAULT_MODE)
;
Char20: .
{
skipCurrentTokenConsuming();
referenceCatched = false;
insideReferenceArguments = false;
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode serialField;
Space2: WS -> type(WS);
FIELD_NAME: [a-zA-Z0-9_-]+ -> mode(serialFieldFieldType);
Char3: .
{
skipCurrentTokenConsuming();
referenceCatched = false;
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode serialFieldFieldType;
Space3: WS -> type(WS);
FIELD_TYPE: [a-zA-Z0-9_-]+ -> mode(DEFAULT_MODE);
Char4: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode exception;
Space4: WS -> type(WS);
CLASS_NAME: ([a-zA-Z0-9_-] | '.')+ -> mode(DEFAULT_MODE);
Char5: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// JAVADOC INLINE TAG MODES ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
mode javadocInlineTag;
CODE_LITERAL : '@code' {recognizeXmlTags=false;} -> mode(code);
DOC_ROOT_LITERAL : '@docRoot' -> mode(DEFAULT_MODE);
INHERIT_DOC_LITERAL : '@inheritDoc' -> mode(DEFAULT_MODE);
LINK_LITERAL : '@link' -> pushMode(seeLink);
LINKPLAIN_LITERAL : '@linkplain' -> pushMode(seeLink);
LITERAL_LITERAL : '@literal' {recognizeXmlTags=false;} -> mode(code);
VALUE_LITERAL : '@value' -> pushMode(value);
CustomName1: '@' [a-zA-Z0-9]+ -> type(CUSTOM_NAME), mode(DEFAULT_MODE);
Char6: . -> type(CHAR), mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode code;
Space7: WS -> type(WS), mode(codeText);
Newline2: NEWLINE -> type(NEWLINE), mode(codeText);
Leading_asterisk4: LEADING_ASTERISK -> type(LEADING_ASTERISK);
Char7: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode codeText;
Leading_asterisk5: LEADING_ASTERISK -> type(LEADING_ASTERISK);
Skobki: '{' (~[}] | Skobki)* '}' -> type(CHAR);
Text: ~[}] -> type(CHAR);
Char8: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
mode value;
Space6: WS -> type(WS);
Newline4: NEWLINE -> type(NEWLINE);
Package2: PACKAGE -> type(PACKAGE);
Dot2: DOT -> type(DOT);
Class2: CLASS -> type(CLASS);
Hash2: HASH -> type(HASH), mode(classMemeber);
End1: JAVADOC_INLINE_TAG_END
{insideJavadocInlineTag--; recognizeXmlTags=true;}
-> type(JAVADOC_INLINE_TAG_END), mode(DEFAULT_MODE)
;
Char10: .
{
skipCurrentTokenConsuming();
} -> skip, mode(DEFAULT_MODE);
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// HTML TAG MODES //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
mode xmlTagDefinition;
CLOSE : '>' {htmlTagNameCatched = false;} -> mode(DEFAULT_MODE) ;
SLASH_CLOSE : '/>' {htmlTagNameCatched = false;} -> mode(DEFAULT_MODE) ;
SLASH : '/' ;
EQUALS : '=' -> mode(htmlAttr);
// with optional end tag
P_HTML_TAG_NAME: P {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
LI_HTML_TAG_NAME: L I {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
TR_HTML_TAG_NAME: T R {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
TD_HTML_TAG_NAME: T D {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
TH_HTML_TAG_NAME: T H {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
BODY_HTML_TAG_NAME: B O D Y {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
COLGROUP_HTML_TAG_NAME: C O L G R O U P {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
DD_HTML_TAG_NAME: D D {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
DT_HTML_TAG_NAME: D T {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
HEAD_HTML_TAG_NAME: H E A D {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
HTML_HTML_TAG_NAME: H T M L {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
OPTION_HTML_TAG_NAME: O P T I O N {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
TBODY_HTML_TAG_NAME: T B O D Y {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
TFOOT_HTML_TAG_NAME: T F O O T {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
THEAD_HTML_TAG_NAME: T H E A D {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
// singleton tags
AREA_HTML_TAG_NAME: A R E A {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
BASE_HTML_TAG_NAME: B A S E {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
BASEFRONT_HTML_TAG_NAME: B A S E F R O N T {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
BR_HTML_TAG_NAME: B R {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
COL_HTML_TAG_NAME: C O L {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
FRAME_HTML_TAG_NAME: F R A M E {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
HR_HTML_TAG_NAME: H R {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
IMG_HTML_TAG_NAME: I M G {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
INPUT_HTML_TAG_NAME: I N P U T {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
ISINDEX_HTML_TAG_NAME: I S I N D E X {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
LINK_HTML_TAG_NAME: L I N K {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
META_HTML_TAG_NAME: M E T A {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
PARAM_HTML_TAG_NAME: P A R A M {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
// other tag names and attribute names
HTML_TAG_NAME: NAME_START_CHAR NAME_CHAR* {htmlTagNameCatched=true;};
LeadingLEADING_ASTERISK1: LEADING_ASTERISK -> type(LEADING_ASTERISK);
Newline1: NEWLINE -> type(NEWLINE);
WhiteSpace3: WS -> type(WS);
Char11: .
{
skipCurrentTokenConsuming();
htmlTagNameCatched = false;
} -> skip, mode(DEFAULT_MODE);
fragment
HEXDIGIT : [a-fA-F0-9] ;
fragment
DIGIT : [0-9] ;
fragment
NAME_CHAR : NAME_START_CHAR
| '-' | '_' | '.' | DIGIT
| '\u00B7'
| '\u0300'..'\u036F'
| '\u203F'..'\u2040'
;
fragment
NAME_START_CHAR
: [:a-zA-Z]
| '\u2070'..'\u218F'
| '\u2C00'..'\u2FEF'
| '\u3001'..'\uD7FF'
| '\uF900'..'\uFDCF'
| '\uFDF0'..'\uFFFD'
;
fragment
FragmentReference: ([a-zA-Z0-9_-] | '.')+
| ([a-zA-Z0-9_-] | '.')* '#' [a-zA-Z0-9_-]+ ( '(' (([a-zA-Z0-9_-] | '.')+ | ',' | ' ')* ')' )?
;
//case insensitive alphabet
fragment A:('a'|'A');
fragment B:('b'|'B');
fragment C:('c'|'C');
fragment D:('d'|'D');
fragment E:('e'|'E');
fragment F:('f'|'F');
fragment G:('g'|'G');
fragment H:('h'|'H');
fragment I:('i'|'I');
fragment J:('j'|'J');
fragment K:('k'|'K');
fragment L:('l'|'L');
fragment M:('m'|'M');
fragment N:('n'|'N');
fragment O:('o'|'O');
fragment P:('p'|'P');
fragment Q:('q'|'Q');
fragment R:('r'|'R');
fragment S:('s'|'S');
fragment T:('t'|'T');
fragment U:('u'|'U');
fragment V:('v'|'V');
fragment W:('w'|'W');
fragment X:('x'|'X');
fragment Y:('y'|'Y');
fragment Z:('z'|'Z');
//////////////////////////////////////////////////////////////////////////////////////
mode htmlAttr;
Leading_asterisk7: LEADING_ASTERISK -> type(LEADING_ASTERISK);
ATTR_VALUE : '"' ~[<"]* '"' {attributeCatched=true;}
| '\'' ~[<']* '\'' {attributeCatched=true;}
| ( '-' | '+' | DIGIT)+ {attributeCatched=true;}
| (~[> \t\n/] | SlashInAttr)+ {attributeCatched=true;}
;
fragment SlashInAttr: '/' {_input.LA(1) != '>'}?;
Char12: . {attributeCatched}?
{
skipCurrentTokenConsuming();
attributeCatched = false;
} -> skip, mode(xmlTagDefinition);
WhiteSpace2: WS -> type(WS);
//////////////////////////////////////////////////////////////////////////////////////
mode htmlComment;
HTML_COMMENT_END: '-->' -> mode(DEFAULT_MODE);
LeadingAst: LEADING_ASTERISK -> type(LEADING_ASTERISK);
Newline6: NEWLINE -> type(NEWLINE);
WhiteSpace: WS -> type(WS);
CommentChar: . -> type(CHAR);

View File

@ -0,0 +1,908 @@
parser grammar JavadocParser;
options { tokenVocab=JavadocLexer; }
@parser::header {
package com.puppycrawl.tools.checkstyle.grammars.javadoc;
}
@parser::members {
boolean isNextJavadocTag() {
int token1 = _input.LA(2);
int token2 = _input.LA(3);
return isJavadocTag(token1)
|| (token1 == WS && isJavadocTag(token2));
}
boolean isJavadocTag(int type) {
switch(type) {
case AUTHOR_LITERAL:
case DEPRECATED_LITERAL:
case EXCEPTION_LITERAL:
case PARAM_LITERAL:
case RETURN_LITERAL:
case SEE_LITERAL:
case SERIAL_LITERAL:
case SERIAL_FIELD_LITERAL:
case SERIAL_DATA_LITERAL:
case SINCE_LITERAL:
case THROWS_LITERAL:
case VERSION_LITERAL:
case CUSTOM_NAME:
return true;
default:
return false;
}
}
boolean isSameTagNames(ParserRuleContext htmlTagOpen, ParserRuleContext htmlTagClose) {
String openTag = htmlTagOpen.getToken(HTML_TAG_NAME, 0).getText().toLowerCase();
String closeTag = htmlTagClose.getToken(HTML_TAG_NAME, 0).getText().toLowerCase();
System.out.println(openTag + " - " + closeTag);
return openTag.equals(closeTag);
}
}
javadoc: (
htmlElement
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag
)*
(LEADING_ASTERISK? WS* javadocTag)*
EOF;
htmlElement: htmlTag
| singletonElement
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| pTagClose
| liTagClose
| trTagClose
| tdTagClose
| thTagClose
| bodyTagClose
| colgroupTagClose
| ddTagClose
| dtTagClose
| headTagClose
| htmlTagClose
| optionTagClose
| tbodyTagClose
| theadTagClose
| tfootTagClose
;
htmlElementOpen: OPEN HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
htmlElementClose: OPEN SLASH HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
attribute: HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* EQUALS (NEWLINE | LEADING_ASTERISK | WS)* (ATTR_VALUE | text | HTML_TAG_NAME);
htmlTag: htmlElementOpen (htmlElement
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)* htmlElementClose //{isSameTagNames($htmlElementOpen.ctx, $htmlElementClose.ctx)}?
| htmlElementOpen (htmlElement
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
{notifyErrorListeners($htmlElementOpen.ctx.getToken(HTML_TAG_NAME, 0).getSymbol(), "javadoc.missed.html.close", null);}
;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////// HTML TAGS WITH OPTIONAL END TAG ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
pTagOpen: OPEN P_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
pTagClose: OPEN SLASH P_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
paragraph: pTagOpen
(htmlTag
| singletonTag
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
pTagClose
;
liTagOpen: OPEN LI_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
liTagClose: OPEN SLASH LI_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
li: liTagOpen
(htmlTag
| singletonTag
| paragraph
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
liTagClose
;
trTagOpen: OPEN TR_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
trTagClose: OPEN SLASH TR_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tr: trTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
trTagClose
;
tdTagOpen: OPEN TD_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tdTagClose: OPEN SLASH TD_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
td: tdTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
tdTagClose
;
thTagOpen: OPEN TH_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
thTagClose: OPEN SLASH TH_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
th: thTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
thTagClose
;
bodyTagOpen: OPEN BODY_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
bodyTagClose: OPEN SLASH BODY_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
body: bodyTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
bodyTagClose
;
colgroupTagOpen: OPEN COLGROUP_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
colgroupTagClose: OPEN SLASH COLGROUP_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
colgroup: colgroupTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| dd
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
colgroupTagClose
;
ddTagOpen: OPEN DD_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
ddTagClose: OPEN SLASH DD_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
dd: ddTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dt
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
ddTagClose
;
dtTagOpen: OPEN DT_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
dtTagClose: OPEN SLASH DT_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
dt: dtTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| head
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
dtTagClose
;
headTagOpen: OPEN HEAD_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
headTagClose: OPEN SLASH HEAD_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
head: headTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| html
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
headTagClose
;
htmlTagOpen: OPEN HTML_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
htmlTagClose: OPEN SLASH HTML_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
html: htmlTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| option
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
htmlTagClose
;
optionTagOpen: OPEN OPTION_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
optionTagClose: OPEN SLASH OPTION_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
option: optionTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| tbody
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| tbodyTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
optionTagClose
;
tbodyTagOpen: OPEN TBODY_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tbodyTagClose: OPEN SLASH TBODY_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tbody: tbodyTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| thead
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| theadTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
tbodyTagClose
;
tfootTagOpen: OPEN TFOOT_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tfootTagClose: OPEN SLASH TFOOT_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
tfoot: tfootTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| thead
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| theadTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
tfootTagClose
;
theadTagOpen: OPEN THEAD_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
theadTagClose: OPEN SLASH THEAD_HTML_TAG_NAME (NEWLINE | LEADING_ASTERISK | WS)* CLOSE;
thead: theadTagOpen
(htmlTag
| singletonTag
| paragraph
| li
| tr
| td
| th
| body
| colgroup
| dd
| dt
| head
| html
| option
| tbody
| tfoot
| pTagOpen
| liTagOpen
| trTagOpen
| tdTagOpen
| thTagOpen
| bodyTagOpen
| colgroupTagOpen
| ddTagOpen
| dtTagOpen
| headTagOpen
| htmlTagOpen
| optionTagOpen
| tbodyTagOpen
| tfootTagOpen
| ({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag)*
theadTagClose
;
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// SINLETON HTML TAGS //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
singletonElement: singletonTag
| areaTag
| baseTag
| basefrontTag
| brTag
| colTag
| frameTag
| hrTag
| imgTag
| inputTag
| isindexTag
| linkTag
| metaTag
| paramTag
| wrongSinletonTag
;
singletonTag: OPEN
(
HTML_TAG_NAME
| P_HTML_TAG_NAME
| LI_HTML_TAG_NAME
| TR_HTML_TAG_NAME
| TD_HTML_TAG_NAME
| TH_HTML_TAG_NAME
| BODY_HTML_TAG_NAME
| COLGROUP_HTML_TAG_NAME
| DD_HTML_TAG_NAME
| DT_HTML_TAG_NAME
| HEAD_HTML_TAG_NAME
| HTML_HTML_TAG_NAME
| OPTION_HTML_TAG_NAME
| TBODY_HTML_TAG_NAME
| TFOOT_HTML_TAG_NAME
| THEAD_HTML_TAG_NAME
)
(attribute | NEWLINE | LEADING_ASTERISK | WS)* SLASH_CLOSE;
areaTag: OPEN AREA_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
baseTag: OPEN BASE_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
basefrontTag: OPEN BASEFRONT_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
brTag: OPEN BR_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
colTag: OPEN COL_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
frameTag: OPEN FRAME_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
hrTag: OPEN HR_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
imgTag: OPEN IMG_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
inputTag: OPEN INPUT_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
isindexTag: OPEN ISINDEX_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
linkTag: OPEN LINK_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
metaTag: OPEN META_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
paramTag: OPEN PARAM_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)* (SLASH_CLOSE | CLOSE);
wrongSinletonTag: OPEN SLASH singletonTagName CLOSE {notifyErrorListeners($singletonTagName.start, "javadoc.wrong.singleton.html.tag", null);}
;
singletonTagName: (AREA_HTML_TAG_NAME
| BASE_HTML_TAG_NAME
| BASEFRONT_HTML_TAG_NAME
| BR_HTML_TAG_NAME
| COL_HTML_TAG_NAME
| FRAME_HTML_TAG_NAME
| HR_HTML_TAG_NAME
| IMG_HTML_TAG_NAME
| INPUT_HTML_TAG_NAME
| ISINDEX_HTML_TAG_NAME
| LINK_HTML_TAG_NAME
| META_HTML_TAG_NAME
| PARAM_HTML_TAG_NAME
)
;
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// JAVADOC TAGS ////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
description: (
({!isNextJavadocTag()}? LEADING_ASTERISK)
| htmlComment
| CDATA
| NEWLINE
| text
| javadocInlineTag
| htmlElement
)+;
reference:
(
PACKAGE (DOT | CLASS)* HASH? MEMBER? parameters?
| (DOT | CLASS)+ HASH? MEMBER? parameters?
| HASH? MEMBER parameters?
)
;
parameters: LEFT_BRACE (ARGUMENT | COMMA | WS | NEWLINE | LEADING_ASTERISK)* RIGHT_BRACE;
javadocTag: AUTHOR_LITERAL (WS | NEWLINE)* description?
| DEPRECATED_LITERAL (WS | NEWLINE)* description?
| EXCEPTION_LITERAL (WS | NEWLINE)* CLASS_NAME? (WS | NEWLINE)* description?
| PARAM_LITERAL (WS | NEWLINE)* PARAMETER_NAME? (WS | NEWLINE)* description?
| RETURN_LITERAL (WS | NEWLINE)* description?
| SEE_LITERAL (WS | NEWLINE)* reference? (STRING | htmlElement)* (WS | NEWLINE)* description?
| SERIAL_LITERAL (WS | NEWLINE)* (LITERAL_INCLUDE | LITERAL_EXCLUDE)? description?
| SERIAL_DATA_LITERAL (WS | NEWLINE)* description?
| SERIAL_FIELD_LITERAL (WS | NEWLINE)* FIELD_NAME? (WS | NEWLINE)* FIELD_TYPE? (WS | NEWLINE)* description?
| SINCE_LITERAL (WS | NEWLINE)* description?
| THROWS_LITERAL (WS | NEWLINE)* CLASS_NAME? (WS | NEWLINE)* description?
| VERSION_LITERAL (WS | NEWLINE)* description?
| CUSTOM_NAME (WS | NEWLINE)* description?
;
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////// JAVADOC INLINE TAGS /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
javadocInlineTag:
JAVADOC_INLINE_TAG_START
(
CODE_LITERAL (WS | NEWLINE | LEADING_ASTERISK | text)*
| DOC_ROOT_LITERAL (WS | NEWLINE | LEADING_ASTERISK)*
| INHERIT_DOC_LITERAL (WS | NEWLINE | LEADING_ASTERISK)*
| LINK_LITERAL (WS | NEWLINE | LEADING_ASTERISK)* reference description?
| LINKPLAIN_LITERAL (WS | NEWLINE | LEADING_ASTERISK)* reference description?
| LITERAL_LITERAL (WS | NEWLINE | LEADING_ASTERISK | text)*
| VALUE_LITERAL (WS | NEWLINE | LEADING_ASTERISK)* reference?
| CUSTOM_NAME (WS | NEWLINE | LEADING_ASTERISK)+ description?
)
JAVADOC_INLINE_TAG_END
;
htmlComment: HTML_COMMENT_START (text | NEWLINE | LEADING_ASTERISK)* HTML_COMMENT_END;
text : (CHAR | WS)+ ;

View File

@ -53,4 +53,6 @@
<!-- Methods that build fake AST are very long-->
<suppress checks="MethodLength" files="src[\\/]test[\\/]java[\\/]com[\\/]puppycrawl[\\/]tools[\\/]checkstyle[\\/]comments[\\/]CommentsTest\.java"/>
<suppress checks="." files=".*JavadocTokenTypes\.java"/>
</suppressions>