BNF for JspParser

NON-TERMINALS


/**
 * The root of the AST of a JSP.
 */
CompilationUnit ::= Prolog Content <EOF>

/**
 * The optional prolog of a JSP, including (xml) declarations and DTD.
 */
Prolog ::= ( ( CommentTag | JspComment )* Declaration )? ( ( CommentTag | JspComment )* DoctypeDeclaration )?

/**
 * Everything between a start-tag and the corresponding end-tag of an element.
 */
Content ::= ( Text | ContentElementPossiblyWithText ) ( ContentElementPossiblyWithText )*

/**
 * A single (non-text) element that can occur between a start- and end-tag of an element.
 * Possibly followed by text.
 */
ContentElementPossiblyWithText ::= ( CommentTag | Element | CData | JspComment | JspDeclaration | JspExpression | JspScriptlet | JspDirective ) ( Text )?

JspDirective ::= <JSP_DIRECTIVE_START> <JSP_DIRECTIVE_NAME> ( JspDirectiveAttribute )* <JSP_DIRECTIVE_END>

JspDirectiveAttribute ::= <JSP_DIRECTIVE_ATTRIBUTE_NAME> <JSP_DIRECTIVE_ATTRIBUTE_EQUALS> <JSP_DIRECTIVE_ATTRIBUTE_VALUE>

JspScriptlet ::= <JSP_SCRIPTLET_START> <JSP_SCRIPTLET> <JSP_SCRIPTLET_END>

JspExpression ::= <JSP_EXPRESSION_START> <JSP_EXPRESSION> <JSP_EXPRESSION_END>

JspDeclaration ::= <JSP_DECLARATION_START> <JSP_DECLARATION> <JSP_DECLARATION_END>

JspComment ::= <JSP_COMMENT_START> <JSP_COMMENT_CONTENT> <JSP_COMMENT_END>

/**
 * This production groups all characters between two tags, where
 * tag is an xml-tag "<...>" or a jsp-page-tag "<%...%>" or CDATA "<![CDATA[...]]>".
 * Text consists of unparsed text and/or Expression Language expressions.
 */
Text ::= ( UnparsedText | ElExpression )+

UnparsedText ::= <UNPARSED_TEXT>

/**
 * Text that contains no single quotes, and that does not contain the start
 * of a EL expression or value binding.
 */
UnparsedTextNoSingleQuotes ::= <UNPARSED_TEXT_NO_SINGLE_QUOTES>

/**
 * Text that contains no double quotes, and that does not contain the start
 * of a EL expression or value binding.
 */
UnparsedTextNoDoubleQuotes ::= <UNPARSED_TEXT_NO_DOUBLE_QUOTES>


/**
 * An EL expression, not within an attribute value.
 */
ElExpression ::= <EL_EXPRESSION>

ValueBindingInAttribute ::= <VALUE_BINDING_IN_ATTRIBUTE>

ElExpressionInAttribute ::= <EL_EXPRESSION_IN_ATTRIBUTE>

CData ::= <CDATA_START> ( <UNPARSED> )* <CDATA_END>

/**
 * A XML element, either with a single empty tag, or with a starting and closing tag
 * with optional contained content.
 */
Element ::= <TAG_START> <TAG_NAME> ( Attribute )* ( ( <TAG_END> ( Content )? <ENDTAG_START> <TAG_NAME> <TAG_END> )| ( <TAG_SLASHEND> ) )

Attribute ::= <ATTR_NAME> ( <ATTR_EQ> AttributeValue )


/**
 * The value of an attribute of an element.
 * EL expressions, JSF value bindings, and JSP expressions
 * are parsed as sub-nodes of the AttributeValue node.
 */
AttributeValue ::= ( ( <DOUBLE_QUOTE> ( ( UnparsedTextNoDoubleQuotes | QuoteIndependentAttributeValueContent ) )* ( <ENDING_DOUBLE_QUOTE> | <DOLLAR_OR_HASH_DOUBLE_QUOTE> ) )| ( <SINGLE_QUOTE> ( ( UnparsedTextNoSingleQuotes | QuoteIndependentAttributeValueContent ) )* ( <ENDING_SINGLE_QUOTE> | <DOLLAR_OR_HASH_SINGLE_QUOTE> ) ) )

/**
 * Partial content of an attribute value that can contain all quotes.
 * This groups EL expressions, value bindings, and JSP expressions.
 */
QuoteIndependentAttributeValueContent ::= ( ElExpressionInAttribute | ValueBindingInAttribute | JspExpressionInAttribute )

JspExpressionInAttribute ::= <JSP_EXPRESSION_IN_ATTRIBUTE>

CommentTag ::= <COMMENT_START> ( <COMMENT_TEXT> )* <COMMENT_END>
  
Declaration ::= <DECL_START> <TAG_NAME> ( Attribute )* <DECL_END>

DoctypeDeclaration ::= <DOCTYPE_DECL_START> <WHITESPACES> <NAME> ( <WHITESPACES> )? ( DoctypeExternalId ( <WHITESPACES> )? )? <DOCTYPE_DECL_END>

DoctypeExternalId ::= ( <SYSTEM> <WHITESPACES> <QUOTED_LITERAL> )| ( <PUBLIC> <WHITESPACES> <QUOTED_LITERAL> <WHITESPACES> <QUOTED_LITERAL> )

TOKENS

<DEFAULT> TOKEN : { 
}

<DEFAULT, JspDirectiveState, JspDirectiveAttributesState> SKIP : { 
<(<WHITESPACE>)+>
}

<AttrValueState, AfterTagState, InTagState> SPECIAL_TOKEN : { 
<(<WHITESPACE>)+>
}

<DEFAULT, AfterTagState> TOKEN : { 
<TAG_START: "<">
|<ENDTAG_START: "</">
|<COMMENT_START: "<!--">
|<DECL_START: "<?">
|<DOCTYPE_DECL_START: "<!DOCTYPE">
|<CDATA_START: "<![CDATA[">
|<JSP_COMMENT_START: "<%--">
|<JSP_DECLARATION_START: "<%!">
|<JSP_EXPRESSION_START: "<%=">
|<JSP_SCRIPTLET_START: "<%">
|<JSP_DIRECTIVE_START: "<%@">
}

<AfterTagState> TOKEN : { 
<EL_EXPRESSION: "${" (<QUOTED_STRING> | <TEXT_IN_EL>)* "}">
|<UNPARSED_TEXT: (<NO_LT_OR_DOLLAR> | <DOLLAR> <NO_OPENBRACE_OR_LT> | <EL_ESCAPE>)+>
}

<JspDirectiveState> TOKEN : { 
<JSP_DIRECTIVE_NAME: <IDENTIFIER>>
}

<JspDirectiveAttributesState> TOKEN : { 
<JSP_DIRECTIVE_ATTRIBUTE_NAME: <IDENTIFIER>>
|<JSP_DIRECTIVE_ATTRIBUTE_EQUALS: "=">
|<JSP_DIRECTIVE_ATTRIBUTE_VALUE: <QUOTED_STRING>>
|<JSP_DIRECTIVE_END: "%>">
}

<JspScriptletState> TOKEN : { 
<JSP_SCRIPTLET_END: "%>">
|<JSP_SCRIPTLET: <NO_JSP_TAG_END>>
}

<JspExpressionState> TOKEN : { 
<JSP_EXPRESSION_END: "%>">
|<JSP_EXPRESSION: <NO_JSP_TAG_END>>
}

<JspDeclarationState> TOKEN : { 
<JSP_DECLARATION_END: "%>">
|<JSP_DECLARATION: <NO_JSP_TAG_END>>
}

<JspCommentState> TOKEN : { 
<JSP_COMMENT_END: "--%>">
|<JSP_COMMENT_CONTENT: <NO_JSP_COMMENT_END>>
}

<DocTypeState, DocTypeExternalIdState> TOKEN : { 
<WHITESPACES: (<WHITESPACE>)+>
}

<DocTypeState> TOKEN : { 
<NAME: <XMLNAME>>
}

<DocTypeExternalIdState> TOKEN : { 
<PUBLIC: "PUBLIC">
|<SYSTEM: "SYSTEM">
|<DOCTYPE_DECL_END: ">">
|<QUOTED_LITERAL: <QUOTED_STRING>>
}

<CDataState> TOKEN : { 
<UNPARSED: ~[]>
|<CDATA_END: "]]>">
}

<StartTagState> TOKEN : { 
<TAG_NAME: <IDENTIFIER>>
|<LST_ERROR: ~[]>
}

<InTagState> TOKEN : { 
<ATTR_NAME: <IDENTIFIER>>
|<TAG_END: ">">
|<DECL_END: "?>" | "!>">
|<TAG_SLASHEND: "/>">
|<ATTR_EQ: "=">
|<IN_TAG_ERROR: ~[]>
}

<AttrValueState> TOKEN : { 
<SINGLE_QUOTE: "\'">
|<DOUBLE_QUOTE: "\"">
}

<AttrValueBetweenSingleQuotesState, AttrValueBetweenDoubleQuotesState> TOKEN : { 
<EL_EXPRESSION_IN_ATTRIBUTE: "${" (<QUOTED_STRING> | <TEXT_IN_EL>)* "}">
|<VALUE_BINDING_IN_ATTRIBUTE: "#{" (<QUOTED_STRING> | <TEXT_IN_EL>)* "}">
|<JSP_EXPRESSION_IN_ATTRIBUTE: "<%=" <NO_JSP_TAG_END> "%>">
}

<AttrValueBetweenSingleQuotesState> TOKEN : { 
<ENDING_SINGLE_QUOTE: "\'">
|<UNPARSED_TEXT_NO_SINGLE_QUOTES: (~["$","#","\'"] | ["$","#"] ~["{","\'"] | <EL_ESCAPE>)+>
|<DOLLAR_OR_HASH_SINGLE_QUOTE: ["$","#"] "\'">
}

<AttrValueBetweenDoubleQuotesState> TOKEN : { 
<ENDING_DOUBLE_QUOTE: "\"">
|<UNPARSED_TEXT_NO_DOUBLE_QUOTES: (~["$","#","\""] | ["$","#"] ~["{","\""] | <EL_ESCAPE>)+>
|<DOLLAR_OR_HASH_DOUBLE_QUOTE: ["$","#"] "\"">
}

<CommentState> TOKEN : { 
<COMMENT_END: "--" (" ")* ">" | "->">
|<COMMENT_TEXT: ~[]>
}