aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiyush Sharma <ps26oct@gmail.com>2017-08-24 06:40:14 +0530
committerVladislav Lisetskii <vladlis54@gmail.com>2017-08-25 04:34:24 +0300
commit6ffc17dda63fddd77d284ad3cf5c7067ad9db318 (patch)
treebd64001c6a3dd9f53acd18b2c43926afd8ddb286
parent5e00b9c0f2a98e0bfeedda2dc30c5a3cc3f64a56 (diff)
downloadcheckstyle-6ffc17dda63fddd77d284ad3cf5c7067ad9db318.tar.gz
Issue #3332: Added HTML void element 'source'
-rw-r--r--src/main/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.java8
-rw-r--r--src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocLexer.g41
-rw-r--r--src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParser.g44
-rw-r--r--src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java1
-rw-r--r--src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java6
-rw-r--r--src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java2
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocWrongSingletonTagInJavadoc.java5
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/InputHtmlVoidElementSource.javadoc42
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/expectedHtmlVoidElementSourceAst.txt761
9 files changed, 829 insertions, 1 deletions
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.java
index acab496a4..834c6f88c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.java
@@ -1584,6 +1584,14 @@ public final class JavadocTokenTypes {
public static final int KEYGEN_TAG = JavadocParser.RULE_keygenTag + RULE_TYPES_OFFSET;
/** "keygen" tag name. */
public static final int KEYGEN_HTML_TAG_NAME = JavadocParser.KEYGEN_HTML_TAG_NAME;
+ /**
+ * HTML void element {@code <source>}.
+ * @see #SINGLETON_ELEMENT
+ * @see "https://www.w3.org/TR/html51/semantics-embedded-content.html#elementdef-media-source"
+ */
+ public static final int SOURCE_TAG = JavadocParser.RULE_sourceTag + RULE_TYPES_OFFSET;
+ /** "source" tag name. */
+ public static final int SOURCE_HTML_TAG_NAME = JavadocParser.SOURCE_HTML_TAG_NAME;
///////////////////////////////////////////////////////////////////////////////////////////////
/** Html comment: {@code <!-- -->}. */
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocLexer.g4 b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocLexer.g4
index 302e97da0..b7e1a69ee 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocLexer.g4
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocLexer.g4
@@ -310,6 +310,7 @@ META_HTML_TAG_NAME: M E T A {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
PARAM_HTML_TAG_NAME: P A R A M {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
EMBED_HTML_TAG_NAME: E M B E D {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
KEYGEN_HTML_TAG_NAME: K E Y G E N {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
+SOURCE_HTML_TAG_NAME: S O U R C E {!htmlTagNameCatched}? {htmlTagNameCatched=true;};
// other tag names and attribute names
HTML_TAG_NAME: NAME_START_CHAR NAME_CHAR* {htmlTagNameCatched=true;};
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParser.g4 b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParser.g4
index f41489ce0..5b612964b 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParser.g4
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParser.g4
@@ -769,6 +769,7 @@ singletonElement: emptyTag
| paramTag
| embedTag
| keygenTag
+ | sourceTag
| wrongSinletonTag
;
@@ -819,6 +820,8 @@ embedTag: START EMBED_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS
(SLASH_END | END);
keygenTag: START KEYGEN_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)*
(SLASH_END | END);
+sourceTag: START SOURCE_HTML_TAG_NAME (attribute | NEWLINE | LEADING_ASTERISK | WS)*
+ (SLASH_END | END);
wrongSinletonTag: START SLASH singletonTagName
END {notifyErrorListeners($singletonTagName.start,
@@ -839,6 +842,7 @@ singletonTagName: (AREA_HTML_TAG_NAME
| PARAM_HTML_TAG_NAME
| EMBED_HTML_TAG_NAME
| KEYGEN_HTML_TAG_NAME
+ | SOURCE_HTML_TAG_NAME
)
;
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
index 0cadb50f3..0ccf8101c 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
@@ -303,6 +303,7 @@ public class AbstractJavadocCheckTest extends AbstractModuleTestSupport {
final String[] expected = {
"5: " + getCheckMessage(MSG_JAVADOC_WRONG_SINGLETON_TAG, 9, "embed"),
"10: " + getCheckMessage(MSG_JAVADOC_WRONG_SINGLETON_TAG, 9, "keygen"),
+ "15: " + getCheckMessage(MSG_JAVADOC_WRONG_SINGLETON_TAG, 9, "SOURCE"),
};
verify(checkConfig, getPath("InputAbstractJavadocWrongSingletonTagInJavadoc.java"),
expected);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
index 3c72294cf..692f69ba8 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
@@ -281,4 +281,10 @@ public class JavadocParseTreeTest extends AbstractTreeTestSupport {
verifyJavadocTree(getHtmlPath("expectedHtmlVoidElementKeygenAst.txt"),
getHtmlPath("InputHtmlVoidElementKeygen.javadoc"));
}
+
+ @Test
+ public void testHtmlVoidElementSource() throws Exception {
+ verifyJavadocTree(getHtmlPath("expectedHtmlVoidElementSourceAst.txt"),
+ getHtmlPath("InputHtmlVoidElementSource.javadoc"));
+ }
}
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
index 7c75b40b3..793a13f14 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
@@ -346,6 +346,6 @@ public class JavadocUtilsTest {
@Test
public void testGetTokenNames() {
assertEquals("Unexpected token name",
- "HTML_COMMENT", JavadocUtils.getTokenName(20075));
+ "HTML_COMMENT", JavadocUtils.getTokenName(20076));
}
}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocWrongSingletonTagInJavadoc.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocWrongSingletonTagInJavadoc.java
index 1a2c1afb1..5573641ae 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocWrongSingletonTagInJavadoc.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocWrongSingletonTagInJavadoc.java
@@ -10,4 +10,9 @@ public class InputAbstractJavadocWrongSingletonTagInJavadoc {
* </keygen>
*/
private int field2;
+
+ /**
+ * </SOURCE>
+ */
+ private int field3;
} \ No newline at end of file
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/InputHtmlVoidElementSource.javadoc b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/InputHtmlVoidElementSource.javadoc
new file mode 100644
index 000000000..607b8d61d
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/InputHtmlVoidElementSource.javadoc
@@ -0,0 +1,42 @@
+* <p> <source> </p>
+* <li> <source> </li>
+* <tr> <source> </tr>
+* <td> <source> </td>
+* <th> <source> </th>
+* <body> <source> </body>
+* <colgroup> <source> </colgroup>
+* <dd> <source> </dd>
+* <dt> <source> </dt>
+* <head> <source> </head>
+* <html> <source> </html>
+* <option> <source> </option>
+* <tbody> <source> </tbody>
+* <thead> <source> </thead>
+* <tfoot> <source> </tfoot>
+
+* <p> <source/> </p>
+* <li> <source/> </li>
+* <tr> <source/> </tr>
+* <td> <source/> </td>
+* <th> <source/> </th>
+* <body> <source/> </body>
+* <colgroup> <source/> </colgroup>
+* <dd> <source/> </dd>
+* <dt> <source/> </dt>
+* <head> <source/> </head>
+* <html> <source/> </html>
+* <option> <source/> </option>
+* <tbody> <source/> </tbody>
+* <thead> <source/> </thead>
+* <tfoot> <source/> </tfoot>
+
+* <source>
+* <source/>
+* <source attr="something">
+* <source attr="something"/>
+* <source attr="something" attr2="someotherthing">
+* <source attr="something" attr2="someotherthing"/>
+* <source attr="something"
+* attr2="someotherting">
+* <source attr="something"
+* attr2="someotherting"/> \ No newline at end of file
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/expectedHtmlVoidElementSourceAst.txt b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/expectedHtmlVoidElementSourceAst.txt
new file mode 100644
index 000000000..10c9fd8da
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/javadoc/htmlTags/expectedHtmlVoidElementSourceAst.txt
@@ -0,0 +1,761 @@
+JAVADOC -> JAVADOC [0:0]
+|--LEADING_ASTERISK -> * [0:0]
+|--TEXT -> [0:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [0:2]
+| `--PARAGRAPH -> PARAGRAPH [0:2]
+| |--P_TAG_START -> P_TAG_START [0:2]
+| | |--START -> < [0:2]
+| | |--P_HTML_TAG_NAME -> p [0:3]
+| | `--END -> > [0:4]
+| |--TEXT -> [0:5]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [0:6]
+| | `--SOURCE_TAG -> SOURCE_TAG [0:6]
+| | |--START -> < [0:6]
+| | |--SOURCE_HTML_TAG_NAME -> source [0:7]
+| | `--END -> > [0:13]
+| |--TEXT -> [0:14]
+| `--P_TAG_END -> P_TAG_END [0:15]
+| |--START -> < [0:15]
+| |--SLASH -> / [0:16]
+| |--P_HTML_TAG_NAME -> p [0:17]
+| `--END -> > [0:18]
+|--NEWLINE -> \n [0:19]
+|--LEADING_ASTERISK -> * [1:0]
+|--TEXT -> [1:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [1:2]
+| `--LI -> LI [1:2]
+| |--LI_TAG_START -> LI_TAG_START [1:2]
+| | |--START -> < [1:2]
+| | |--LI_HTML_TAG_NAME -> li [1:3]
+| | `--END -> > [1:5]
+| |--TEXT -> [1:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [1:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [1:7]
+| | |--START -> < [1:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [1:8]
+| | `--END -> > [1:14]
+| |--TEXT -> [1:15]
+| `--LI_TAG_END -> LI_TAG_END [1:16]
+| |--START -> < [1:16]
+| |--SLASH -> / [1:17]
+| |--LI_HTML_TAG_NAME -> li [1:18]
+| `--END -> > [1:20]
+|--NEWLINE -> \n [1:21]
+|--LEADING_ASTERISK -> * [2:0]
+|--TEXT -> [2:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [2:2]
+| `--TR -> TR [2:2]
+| |--TR_TAG_START -> TR_TAG_START [2:2]
+| | |--START -> < [2:2]
+| | |--TR_HTML_TAG_NAME -> tr [2:3]
+| | `--END -> > [2:5]
+| |--TEXT -> [2:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [2:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [2:7]
+| | |--START -> < [2:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [2:8]
+| | `--END -> > [2:14]
+| |--TEXT -> [2:15]
+| `--TR_TAG_END -> TR_TAG_END [2:16]
+| |--START -> < [2:16]
+| |--SLASH -> / [2:17]
+| |--TR_HTML_TAG_NAME -> tr [2:18]
+| `--END -> > [2:20]
+|--NEWLINE -> \n [2:21]
+|--LEADING_ASTERISK -> * [3:0]
+|--TEXT -> [3:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [3:2]
+| `--TD -> TD [3:2]
+| |--TD_TAG_START -> TD_TAG_START [3:2]
+| | |--START -> < [3:2]
+| | |--TD_HTML_TAG_NAME -> td [3:3]
+| | `--END -> > [3:5]
+| |--TEXT -> [3:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [3:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [3:7]
+| | |--START -> < [3:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [3:8]
+| | `--END -> > [3:14]
+| |--TEXT -> [3:15]
+| `--TD_TAG_END -> TD_TAG_END [3:16]
+| |--START -> < [3:16]
+| |--SLASH -> / [3:17]
+| |--TD_HTML_TAG_NAME -> td [3:18]
+| `--END -> > [3:20]
+|--NEWLINE -> \n [3:21]
+|--LEADING_ASTERISK -> * [4:0]
+|--TEXT -> [4:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [4:2]
+| `--TH -> TH [4:2]
+| |--TH_TAG_START -> TH_TAG_START [4:2]
+| | |--START -> < [4:2]
+| | |--TH_HTML_TAG_NAME -> th [4:3]
+| | `--END -> > [4:5]
+| |--TEXT -> [4:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [4:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [4:7]
+| | |--START -> < [4:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [4:8]
+| | `--END -> > [4:14]
+| |--TEXT -> [4:15]
+| `--TH_TAG_END -> TH_TAG_END [4:16]
+| |--START -> < [4:16]
+| |--SLASH -> / [4:17]
+| |--TH_HTML_TAG_NAME -> th [4:18]
+| `--END -> > [4:20]
+|--NEWLINE -> \n [4:21]
+|--LEADING_ASTERISK -> * [5:0]
+|--TEXT -> [5:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [5:2]
+| `--BODY -> BODY [5:2]
+| |--BODY_TAG_START -> BODY_TAG_START [5:2]
+| | |--START -> < [5:2]
+| | |--BODY_HTML_TAG_NAME -> body [5:3]
+| | `--END -> > [5:7]
+| |--TEXT -> [5:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [5:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [5:9]
+| | |--START -> < [5:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [5:10]
+| | `--END -> > [5:16]
+| |--TEXT -> [5:17]
+| `--BODY_TAG_END -> BODY_TAG_END [5:18]
+| |--START -> < [5:18]
+| |--SLASH -> / [5:19]
+| |--BODY_HTML_TAG_NAME -> body [5:20]
+| `--END -> > [5:24]
+|--NEWLINE -> \n [5:25]
+|--LEADING_ASTERISK -> * [6:0]
+|--TEXT -> [6:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [6:2]
+| `--COLGROUP -> COLGROUP [6:2]
+| |--COLGROUP_TAG_START -> COLGROUP_TAG_START [6:2]
+| | |--START -> < [6:2]
+| | |--COLGROUP_HTML_TAG_NAME -> colgroup [6:3]
+| | `--END -> > [6:11]
+| |--TEXT -> [6:12]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [6:13]
+| | `--SOURCE_TAG -> SOURCE_TAG [6:13]
+| | |--START -> < [6:13]
+| | |--SOURCE_HTML_TAG_NAME -> source [6:14]
+| | `--END -> > [6:20]
+| |--TEXT -> [6:21]
+| `--COLGROUP_TAG_END -> COLGROUP_TAG_END [6:22]
+| |--START -> < [6:22]
+| |--SLASH -> / [6:23]
+| |--COLGROUP_HTML_TAG_NAME -> colgroup [6:24]
+| `--END -> > [6:32]
+|--NEWLINE -> \n [6:33]
+|--LEADING_ASTERISK -> * [7:0]
+|--TEXT -> [7:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [7:2]
+| `--DD -> DD [7:2]
+| |--DD_TAG_START -> DD_TAG_START [7:2]
+| | |--START -> < [7:2]
+| | |--DD_HTML_TAG_NAME -> dd [7:3]
+| | `--END -> > [7:5]
+| |--TEXT -> [7:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [7:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [7:7]
+| | |--START -> < [7:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [7:8]
+| | `--END -> > [7:14]
+| |--TEXT -> [7:15]
+| `--DD_TAG_END -> DD_TAG_END [7:16]
+| |--START -> < [7:16]
+| |--SLASH -> / [7:17]
+| |--DD_HTML_TAG_NAME -> dd [7:18]
+| `--END -> > [7:20]
+|--NEWLINE -> \n [7:21]
+|--LEADING_ASTERISK -> * [8:0]
+|--TEXT -> [8:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [8:2]
+| `--DT -> DT [8:2]
+| |--DT_TAG_START -> DT_TAG_START [8:2]
+| | |--START -> < [8:2]
+| | |--DT_HTML_TAG_NAME -> dt [8:3]
+| | `--END -> > [8:5]
+| |--TEXT -> [8:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [8:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [8:7]
+| | |--START -> < [8:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [8:8]
+| | `--END -> > [8:14]
+| |--TEXT -> [8:15]
+| `--DT_TAG_END -> DT_TAG_END [8:16]
+| |--START -> < [8:16]
+| |--SLASH -> / [8:17]
+| |--DT_HTML_TAG_NAME -> dt [8:18]
+| `--END -> > [8:20]
+|--NEWLINE -> \n [8:21]
+|--LEADING_ASTERISK -> * [9:0]
+|--TEXT -> [9:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [9:2]
+| `--HEAD -> HEAD [9:2]
+| |--HEAD_TAG_START -> HEAD_TAG_START [9:2]
+| | |--START -> < [9:2]
+| | |--HEAD_HTML_TAG_NAME -> head [9:3]
+| | `--END -> > [9:7]
+| |--TEXT -> [9:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [9:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [9:9]
+| | |--START -> < [9:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [9:10]
+| | `--END -> > [9:16]
+| |--TEXT -> [9:17]
+| `--HEAD_TAG_END -> HEAD_TAG_END [9:18]
+| |--START -> < [9:18]
+| |--SLASH -> / [9:19]
+| |--HEAD_HTML_TAG_NAME -> head [9:20]
+| `--END -> > [9:24]
+|--NEWLINE -> \n [9:25]
+|--LEADING_ASTERISK -> * [10:0]
+|--TEXT -> [10:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [10:2]
+| `--HTML -> HTML [10:2]
+| |--HTML_TAG_START -> HTML_TAG_START [10:2]
+| | |--START -> < [10:2]
+| | |--HTML_HTML_TAG_NAME -> html [10:3]
+| | `--END -> > [10:7]
+| |--TEXT -> [10:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [10:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [10:9]
+| | |--START -> < [10:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [10:10]
+| | `--END -> > [10:16]
+| |--TEXT -> [10:17]
+| `--HTML_TAG_END -> HTML_TAG_END [10:18]
+| |--START -> < [10:18]
+| |--SLASH -> / [10:19]
+| |--HTML_HTML_TAG_NAME -> html [10:20]
+| `--END -> > [10:24]
+|--NEWLINE -> \n [10:25]
+|--LEADING_ASTERISK -> * [11:0]
+|--TEXT -> [11:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [11:2]
+| `--OPTION -> OPTION [11:2]
+| |--OPTION_TAG_START -> OPTION_TAG_START [11:2]
+| | |--START -> < [11:2]
+| | |--OPTION_HTML_TAG_NAME -> option [11:3]
+| | `--END -> > [11:9]
+| |--TEXT -> [11:10]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [11:11]
+| | `--SOURCE_TAG -> SOURCE_TAG [11:11]
+| | |--START -> < [11:11]
+| | |--SOURCE_HTML_TAG_NAME -> source [11:12]
+| | `--END -> > [11:18]
+| |--TEXT -> [11:19]
+| `--OPTION_TAG_END -> OPTION_TAG_END [11:20]
+| |--START -> < [11:20]
+| |--SLASH -> / [11:21]
+| |--OPTION_HTML_TAG_NAME -> option [11:22]
+| `--END -> > [11:28]
+|--NEWLINE -> \n [11:29]
+|--LEADING_ASTERISK -> * [12:0]
+|--TEXT -> [12:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [12:2]
+| `--TBODY -> TBODY [12:2]
+| |--TBODY_TAG_START -> TBODY_TAG_START [12:2]
+| | |--START -> < [12:2]
+| | |--TBODY_HTML_TAG_NAME -> tbody [12:3]
+| | `--END -> > [12:8]
+| |--TEXT -> [12:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [12:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [12:10]
+| | |--START -> < [12:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [12:11]
+| | `--END -> > [12:17]
+| |--TEXT -> [12:18]
+| `--TBODY_TAG_END -> TBODY_TAG_END [12:19]
+| |--START -> < [12:19]
+| |--SLASH -> / [12:20]
+| |--TBODY_HTML_TAG_NAME -> tbody [12:21]
+| `--END -> > [12:26]
+|--NEWLINE -> \n [12:27]
+|--LEADING_ASTERISK -> * [13:0]
+|--TEXT -> [13:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [13:2]
+| `--THEAD -> THEAD [13:2]
+| |--THEAD_TAG_START -> THEAD_TAG_START [13:2]
+| | |--START -> < [13:2]
+| | |--THEAD_HTML_TAG_NAME -> thead [13:3]
+| | `--END -> > [13:8]
+| |--TEXT -> [13:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [13:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [13:10]
+| | |--START -> < [13:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [13:11]
+| | `--END -> > [13:17]
+| |--TEXT -> [13:18]
+| `--THEAD_TAG_END -> THEAD_TAG_END [13:19]
+| |--START -> < [13:19]
+| |--SLASH -> / [13:20]
+| |--THEAD_HTML_TAG_NAME -> thead [13:21]
+| `--END -> > [13:26]
+|--NEWLINE -> \n [13:27]
+|--LEADING_ASTERISK -> * [14:0]
+|--TEXT -> [14:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [14:2]
+| `--TFOOT -> TFOOT [14:2]
+| |--TFOOT_TAG_START -> TFOOT_TAG_START [14:2]
+| | |--START -> < [14:2]
+| | |--TFOOT_HTML_TAG_NAME -> tfoot [14:3]
+| | `--END -> > [14:8]
+| |--TEXT -> [14:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [14:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [14:10]
+| | |--START -> < [14:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [14:11]
+| | `--END -> > [14:17]
+| |--TEXT -> [14:18]
+| `--TFOOT_TAG_END -> TFOOT_TAG_END [14:19]
+| |--START -> < [14:19]
+| |--SLASH -> / [14:20]
+| |--TFOOT_HTML_TAG_NAME -> tfoot [14:21]
+| `--END -> > [14:26]
+|--NEWLINE -> \n [14:27]
+|--NEWLINE -> \n [15:0]
+|--LEADING_ASTERISK -> * [16:0]
+|--TEXT -> [16:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [16:2]
+| `--PARAGRAPH -> PARAGRAPH [16:2]
+| |--P_TAG_START -> P_TAG_START [16:2]
+| | |--START -> < [16:2]
+| | |--P_HTML_TAG_NAME -> p [16:3]
+| | `--END -> > [16:4]
+| |--TEXT -> [16:5]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [16:6]
+| | `--SOURCE_TAG -> SOURCE_TAG [16:6]
+| | |--START -> < [16:6]
+| | |--SOURCE_HTML_TAG_NAME -> source [16:7]
+| | `--SLASH_END -> /> [16:13]
+| |--TEXT -> [16:15]
+| `--P_TAG_END -> P_TAG_END [16:16]
+| |--START -> < [16:16]
+| |--SLASH -> / [16:17]
+| |--P_HTML_TAG_NAME -> p [16:18]
+| `--END -> > [16:19]
+|--NEWLINE -> \n [16:20]
+|--LEADING_ASTERISK -> * [17:0]
+|--TEXT -> [17:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [17:2]
+| `--LI -> LI [17:2]
+| |--LI_TAG_START -> LI_TAG_START [17:2]
+| | |--START -> < [17:2]
+| | |--LI_HTML_TAG_NAME -> li [17:3]
+| | `--END -> > [17:5]
+| |--TEXT -> [17:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [17:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [17:7]
+| | |--START -> < [17:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [17:8]
+| | `--SLASH_END -> /> [17:14]
+| |--TEXT -> [17:16]
+| `--LI_TAG_END -> LI_TAG_END [17:17]
+| |--START -> < [17:17]
+| |--SLASH -> / [17:18]
+| |--LI_HTML_TAG_NAME -> li [17:19]
+| `--END -> > [17:21]
+|--NEWLINE -> \n [17:22]
+|--LEADING_ASTERISK -> * [18:0]
+|--TEXT -> [18:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [18:2]
+| `--TR -> TR [18:2]
+| |--TR_TAG_START -> TR_TAG_START [18:2]
+| | |--START -> < [18:2]
+| | |--TR_HTML_TAG_NAME -> tr [18:3]
+| | `--END -> > [18:5]
+| |--TEXT -> [18:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [18:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [18:7]
+| | |--START -> < [18:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [18:8]
+| | `--SLASH_END -> /> [18:14]
+| |--TEXT -> [18:16]
+| `--TR_TAG_END -> TR_TAG_END [18:17]
+| |--START -> < [18:17]
+| |--SLASH -> / [18:18]
+| |--TR_HTML_TAG_NAME -> tr [18:19]
+| `--END -> > [18:21]
+|--NEWLINE -> \n [18:22]
+|--LEADING_ASTERISK -> * [19:0]
+|--TEXT -> [19:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [19:2]
+| `--TD -> TD [19:2]
+| |--TD_TAG_START -> TD_TAG_START [19:2]
+| | |--START -> < [19:2]
+| | |--TD_HTML_TAG_NAME -> td [19:3]
+| | `--END -> > [19:5]
+| |--TEXT -> [19:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [19:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [19:7]
+| | |--START -> < [19:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [19:8]
+| | `--SLASH_END -> /> [19:14]
+| |--TEXT -> [19:16]
+| `--TD_TAG_END -> TD_TAG_END [19:17]
+| |--START -> < [19:17]
+| |--SLASH -> / [19:18]
+| |--TD_HTML_TAG_NAME -> td [19:19]
+| `--END -> > [19:21]
+|--NEWLINE -> \n [19:22]
+|--LEADING_ASTERISK -> * [20:0]
+|--TEXT -> [20:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [20:2]
+| `--TH -> TH [20:2]
+| |--TH_TAG_START -> TH_TAG_START [20:2]
+| | |--START -> < [20:2]
+| | |--TH_HTML_TAG_NAME -> th [20:3]
+| | `--END -> > [20:5]
+| |--TEXT -> [20:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [20:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [20:7]
+| | |--START -> < [20:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [20:8]
+| | `--SLASH_END -> /> [20:14]
+| |--TEXT -> [20:16]
+| `--TH_TAG_END -> TH_TAG_END [20:17]
+| |--START -> < [20:17]
+| |--SLASH -> / [20:18]
+| |--TH_HTML_TAG_NAME -> th [20:19]
+| `--END -> > [20:21]
+|--NEWLINE -> \n [20:22]
+|--LEADING_ASTERISK -> * [21:0]
+|--TEXT -> [21:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [21:2]
+| `--BODY -> BODY [21:2]
+| |--BODY_TAG_START -> BODY_TAG_START [21:2]
+| | |--START -> < [21:2]
+| | |--BODY_HTML_TAG_NAME -> body [21:3]
+| | `--END -> > [21:7]
+| |--TEXT -> [21:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [21:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [21:9]
+| | |--START -> < [21:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [21:10]
+| | `--SLASH_END -> /> [21:16]
+| |--TEXT -> [21:18]
+| `--BODY_TAG_END -> BODY_TAG_END [21:19]
+| |--START -> < [21:19]
+| |--SLASH -> / [21:20]
+| |--BODY_HTML_TAG_NAME -> body [21:21]
+| `--END -> > [21:25]
+|--NEWLINE -> \n [21:26]
+|--LEADING_ASTERISK -> * [22:0]
+|--TEXT -> [22:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [22:2]
+| `--COLGROUP -> COLGROUP [22:2]
+| |--COLGROUP_TAG_START -> COLGROUP_TAG_START [22:2]
+| | |--START -> < [22:2]
+| | |--COLGROUP_HTML_TAG_NAME -> colgroup [22:3]
+| | `--END -> > [22:11]
+| |--TEXT -> [22:12]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [22:13]
+| | `--SOURCE_TAG -> SOURCE_TAG [22:13]
+| | |--START -> < [22:13]
+| | |--SOURCE_HTML_TAG_NAME -> source [22:14]
+| | `--SLASH_END -> /> [22:20]
+| |--TEXT -> [22:22]
+| `--COLGROUP_TAG_END -> COLGROUP_TAG_END [22:23]
+| |--START -> < [22:23]
+| |--SLASH -> / [22:24]
+| |--COLGROUP_HTML_TAG_NAME -> colgroup [22:25]
+| `--END -> > [22:33]
+|--NEWLINE -> \n [22:34]
+|--LEADING_ASTERISK -> * [23:0]
+|--TEXT -> [23:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [23:2]
+| `--DD -> DD [23:2]
+| |--DD_TAG_START -> DD_TAG_START [23:2]
+| | |--START -> < [23:2]
+| | |--DD_HTML_TAG_NAME -> dd [23:3]
+| | `--END -> > [23:5]
+| |--TEXT -> [23:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [23:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [23:7]
+| | |--START -> < [23:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [23:8]
+| | `--SLASH_END -> /> [23:14]
+| |--TEXT -> [23:16]
+| `--DD_TAG_END -> DD_TAG_END [23:17]
+| |--START -> < [23:17]
+| |--SLASH -> / [23:18]
+| |--DD_HTML_TAG_NAME -> dd [23:19]
+| `--END -> > [23:21]
+|--NEWLINE -> \n [23:22]
+|--LEADING_ASTERISK -> * [24:0]
+|--TEXT -> [24:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [24:2]
+| `--DT -> DT [24:2]
+| |--DT_TAG_START -> DT_TAG_START [24:2]
+| | |--START -> < [24:2]
+| | |--DT_HTML_TAG_NAME -> dt [24:3]
+| | `--END -> > [24:5]
+| |--TEXT -> [24:6]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [24:7]
+| | `--SOURCE_TAG -> SOURCE_TAG [24:7]
+| | |--START -> < [24:7]
+| | |--SOURCE_HTML_TAG_NAME -> source [24:8]
+| | `--SLASH_END -> /> [24:14]
+| |--TEXT -> [24:16]
+| `--DT_TAG_END -> DT_TAG_END [24:17]
+| |--START -> < [24:17]
+| |--SLASH -> / [24:18]
+| |--DT_HTML_TAG_NAME -> dt [24:19]
+| `--END -> > [24:21]
+|--NEWLINE -> \n [24:22]
+|--LEADING_ASTERISK -> * [25:0]
+|--TEXT -> [25:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [25:2]
+| `--HEAD -> HEAD [25:2]
+| |--HEAD_TAG_START -> HEAD_TAG_START [25:2]
+| | |--START -> < [25:2]
+| | |--HEAD_HTML_TAG_NAME -> head [25:3]
+| | `--END -> > [25:7]
+| |--TEXT -> [25:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [25:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [25:9]
+| | |--START -> < [25:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [25:10]
+| | `--SLASH_END -> /> [25:16]
+| |--TEXT -> [25:18]
+| `--HEAD_TAG_END -> HEAD_TAG_END [25:19]
+| |--START -> < [25:19]
+| |--SLASH -> / [25:20]
+| |--HEAD_HTML_TAG_NAME -> head [25:21]
+| `--END -> > [25:25]
+|--NEWLINE -> \n [25:26]
+|--LEADING_ASTERISK -> * [26:0]
+|--TEXT -> [26:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [26:2]
+| `--HTML -> HTML [26:2]
+| |--HTML_TAG_START -> HTML_TAG_START [26:2]
+| | |--START -> < [26:2]
+| | |--HTML_HTML_TAG_NAME -> html [26:3]
+| | `--END -> > [26:7]
+| |--TEXT -> [26:8]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [26:9]
+| | `--SOURCE_TAG -> SOURCE_TAG [26:9]
+| | |--START -> < [26:9]
+| | |--SOURCE_HTML_TAG_NAME -> source [26:10]
+| | `--SLASH_END -> /> [26:16]
+| |--TEXT -> [26:18]
+| `--HTML_TAG_END -> HTML_TAG_END [26:19]
+| |--START -> < [26:19]
+| |--SLASH -> / [26:20]
+| |--HTML_HTML_TAG_NAME -> html [26:21]
+| `--END -> > [26:25]
+|--NEWLINE -> \n [26:26]
+|--LEADING_ASTERISK -> * [27:0]
+|--TEXT -> [27:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [27:2]
+| `--OPTION -> OPTION [27:2]
+| |--OPTION_TAG_START -> OPTION_TAG_START [27:2]
+| | |--START -> < [27:2]
+| | |--OPTION_HTML_TAG_NAME -> option [27:3]
+| | `--END -> > [27:9]
+| |--TEXT -> [27:10]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [27:11]
+| | `--SOURCE_TAG -> SOURCE_TAG [27:11]
+| | |--START -> < [27:11]
+| | |--SOURCE_HTML_TAG_NAME -> source [27:12]
+| | `--SLASH_END -> /> [27:18]
+| |--TEXT -> [27:20]
+| `--OPTION_TAG_END -> OPTION_TAG_END [27:21]
+| |--START -> < [27:21]
+| |--SLASH -> / [27:22]
+| |--OPTION_HTML_TAG_NAME -> option [27:23]
+| `--END -> > [27:29]
+|--NEWLINE -> \n [27:30]
+|--LEADING_ASTERISK -> * [28:0]
+|--TEXT -> [28:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [28:2]
+| `--TBODY -> TBODY [28:2]
+| |--TBODY_TAG_START -> TBODY_TAG_START [28:2]
+| | |--START -> < [28:2]
+| | |--TBODY_HTML_TAG_NAME -> tbody [28:3]
+| | `--END -> > [28:8]
+| |--TEXT -> [28:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [28:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [28:10]
+| | |--START -> < [28:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [28:11]
+| | `--SLASH_END -> /> [28:17]
+| |--TEXT -> [28:19]
+| `--TBODY_TAG_END -> TBODY_TAG_END [28:20]
+| |--START -> < [28:20]
+| |--SLASH -> / [28:21]
+| |--TBODY_HTML_TAG_NAME -> tbody [28:22]
+| `--END -> > [28:27]
+|--NEWLINE -> \n [28:28]
+|--LEADING_ASTERISK -> * [29:0]
+|--TEXT -> [29:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [29:2]
+| `--THEAD -> THEAD [29:2]
+| |--THEAD_TAG_START -> THEAD_TAG_START [29:2]
+| | |--START -> < [29:2]
+| | |--THEAD_HTML_TAG_NAME -> thead [29:3]
+| | `--END -> > [29:8]
+| |--TEXT -> [29:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [29:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [29:10]
+| | |--START -> < [29:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [29:11]
+| | `--SLASH_END -> /> [29:17]
+| |--TEXT -> [29:19]
+| `--THEAD_TAG_END -> THEAD_TAG_END [29:20]
+| |--START -> < [29:20]
+| |--SLASH -> / [29:21]
+| |--THEAD_HTML_TAG_NAME -> thead [29:22]
+| `--END -> > [29:27]
+|--NEWLINE -> \n [29:28]
+|--LEADING_ASTERISK -> * [30:0]
+|--TEXT -> [30:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [30:2]
+| `--TFOOT -> TFOOT [30:2]
+| |--TFOOT_TAG_START -> TFOOT_TAG_START [30:2]
+| | |--START -> < [30:2]
+| | |--TFOOT_HTML_TAG_NAME -> tfoot [30:3]
+| | `--END -> > [30:8]
+| |--TEXT -> [30:9]
+| |--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [30:10]
+| | `--SOURCE_TAG -> SOURCE_TAG [30:10]
+| | |--START -> < [30:10]
+| | |--SOURCE_HTML_TAG_NAME -> source [30:11]
+| | `--SLASH_END -> /> [30:17]
+| |--TEXT -> [30:19]
+| `--TFOOT_TAG_END -> TFOOT_TAG_END [30:20]
+| |--START -> < [30:20]
+| |--SLASH -> / [30:21]
+| |--TFOOT_HTML_TAG_NAME -> tfoot [30:22]
+| `--END -> > [30:27]
+|--NEWLINE -> \n [30:28]
+|--NEWLINE -> \n [31:0]
+|--LEADING_ASTERISK -> * [32:0]
+|--TEXT -> [32:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [32:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [32:2]
+| `--SOURCE_TAG -> SOURCE_TAG [32:2]
+| |--START -> < [32:2]
+| |--SOURCE_HTML_TAG_NAME -> source [32:3]
+| `--END -> > [32:9]
+|--NEWLINE -> \n [32:10]
+|--LEADING_ASTERISK -> * [33:0]
+|--TEXT -> [33:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [33:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [33:2]
+| `--SOURCE_TAG -> SOURCE_TAG [33:2]
+| |--START -> < [33:2]
+| |--SOURCE_HTML_TAG_NAME -> source [33:3]
+| `--SLASH_END -> /> [33:9]
+|--NEWLINE -> \n [33:11]
+|--LEADING_ASTERISK -> * [34:0]
+|--TEXT -> [34:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [34:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [34:2]
+| `--SOURCE_TAG -> SOURCE_TAG [34:2]
+| |--START -> < [34:2]
+| |--SOURCE_HTML_TAG_NAME -> source [34:3]
+| |--WS -> [34:9]
+| |--ATTRIBUTE -> ATTRIBUTE [34:10]
+| | |--HTML_TAG_NAME -> attr [34:10]
+| | |--EQUALS -> = [34:14]
+| | `--ATTR_VALUE -> "something" [34:15]
+| `--END -> > [34:27]
+|--NEWLINE -> \n [34:28]
+|--LEADING_ASTERISK -> * [35:0]
+|--TEXT -> [35:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [35:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [35:2]
+| `--SOURCE_TAG -> SOURCE_TAG [35:2]
+| |--START -> < [35:2]
+| |--SOURCE_HTML_TAG_NAME -> source [35:3]
+| |--WS -> [35:9]
+| |--ATTRIBUTE -> ATTRIBUTE [35:10]
+| | |--HTML_TAG_NAME -> attr [35:10]
+| | |--EQUALS -> = [35:14]
+| | `--ATTR_VALUE -> "something" [35:15]
+| `--SLASH_END -> /> [35:27]
+|--NEWLINE -> \n [35:29]
+|--LEADING_ASTERISK -> * [36:0]
+|--TEXT -> [36:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [36:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [36:2]
+| `--SOURCE_TAG -> SOURCE_TAG [36:2]
+| |--START -> < [36:2]
+| |--SOURCE_HTML_TAG_NAME -> source [36:3]
+| |--WS -> [36:9]
+| |--ATTRIBUTE -> ATTRIBUTE [36:10]
+| | |--HTML_TAG_NAME -> attr [36:10]
+| | |--EQUALS -> = [36:14]
+| | `--ATTR_VALUE -> "something" [36:15]
+| |--WS -> [36:27]
+| |--ATTRIBUTE -> ATTRIBUTE [36:28]
+| | |--HTML_TAG_NAME -> attr2 [36:28]
+| | |--EQUALS -> = [36:33]
+| | `--ATTR_VALUE -> "someotherthing" [36:34]
+| `--END -> > [36:51]
+|--NEWLINE -> \n [36:52]
+|--LEADING_ASTERISK -> * [37:0]
+|--TEXT -> [37:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [37:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [37:2]
+| `--SOURCE_TAG -> SOURCE_TAG [37:2]
+| |--START -> < [37:2]
+| |--SOURCE_HTML_TAG_NAME -> source [37:3]
+| |--WS -> [37:9]
+| |--ATTRIBUTE -> ATTRIBUTE [37:10]
+| | |--HTML_TAG_NAME -> attr [37:10]
+| | |--EQUALS -> = [37:14]
+| | `--ATTR_VALUE -> "something" [37:15]
+| |--WS -> [37:27]
+| |--ATTRIBUTE -> ATTRIBUTE [37:28]
+| | |--HTML_TAG_NAME -> attr2 [37:28]
+| | |--EQUALS -> = [37:33]
+| | `--ATTR_VALUE -> "someotherthing" [37:34]
+| `--SLASH_END -> /> [37:51]
+|--NEWLINE -> \n [37:53]
+|--LEADING_ASTERISK -> * [38:0]
+|--TEXT -> [38:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [38:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [38:2]
+| `--SOURCE_TAG -> SOURCE_TAG [38:2]
+| |--START -> < [38:2]
+| |--SOURCE_HTML_TAG_NAME -> source [38:3]
+| |--WS -> [38:9]
+| |--ATTRIBUTE -> ATTRIBUTE [38:10]
+| | |--HTML_TAG_NAME -> attr [38:10]
+| | |--EQUALS -> = [38:14]
+| | `--ATTR_VALUE -> "something" [38:15]
+| |--WS -> [38:27]
+| |--NEWLINE -> \n [38:28]
+| |--LEADING_ASTERISK -> * [39:0]
+| |--WS -> [39:1]
+| |--ATTRIBUTE -> ATTRIBUTE [39:2]
+| | |--HTML_TAG_NAME -> attr2 [39:2]
+| | |--EQUALS -> = [39:7]
+| | `--ATTR_VALUE -> "someotherting" [39:8]
+| `--END -> > [39:24]
+|--NEWLINE -> \n [39:25]
+|--LEADING_ASTERISK -> * [40:0]
+|--TEXT -> [40:1]
+|--HTML_ELEMENT -> HTML_ELEMENT [40:2]
+| `--SINGLETON_ELEMENT -> SINGLETON_ELEMENT [40:2]
+| `--SOURCE_TAG -> SOURCE_TAG [40:2]
+| |--START -> < [40:2]
+| |--SOURCE_HTML_TAG_NAME -> source [40:3]
+| |--WS -> [40:9]
+| |--ATTRIBUTE -> ATTRIBUTE [40:10]
+| | |--HTML_TAG_NAME -> attr [40:10]
+| | |--EQUALS -> = [40:14]
+| | `--ATTR_VALUE -> "something" [40:15]
+| |--WS -> [40:27]
+| |--NEWLINE -> \n [40:28]
+| |--LEADING_ASTERISK -> * [41:0]
+| |--WS -> [41:1]
+| |--ATTRIBUTE -> ATTRIBUTE [41:2]
+| | |--HTML_TAG_NAME -> attr2 [41:2]
+| | |--EQUALS -> = [41:7]
+| | `--ATTR_VALUE -> "someotherting" [41:8]
+| `--SLASH_END -> /> [41:24]
+`--EOF -> <EOF> [41:26]