From: Fletcher T. Penney Date: Sat, 4 Feb 2017 13:48:56 +0000 (-0500) Subject: ADDED: Add support for definition lists X-Git-Tag: 0.1.2a^2~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=66092f639ed94b006e02eaebb215fe955ef44abc;p=multimarkdown ADDED: Add support for definition lists --- diff --git a/README.md b/README.md index 570910c..6ff4fac 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,11 @@ * Metadata/Variables * "pathologic" test cases from CommonMark +* 2017-?? -- v 0.1.2a: + + * "pathologic" test suite -- fix handling of nested brackets, e.g. + `[[[[foo]]]]` to avoid bogging down checking for reference links that + don't exist. ## An Announcement! ## @@ -412,6 +417,7 @@ features have been implemented: * Automatic cross-reference targets * Basic Citation support * CriticMarkup support +* Definition lists * Inline and reference footnotes * Image and Link attributes (attributes can now be used with inline links as well as reference links) @@ -440,7 +446,6 @@ Things yet to be completed: * Multiple blocks inside of reference footnotes * Manually specified labels for headers -* Definition lists * Abbreviations * Glossaries * Tables @@ -452,7 +457,7 @@ Things yet to be completed: MultiMarkdown v6 successfully parses the Markdown [syntax page], except for the Setext header at the top. It passes the 29 test files currently in place. -There are a few ad +There are a few at [syntax page]: https://daringfireball.net/projects/markdown/syntax diff --git a/src/html.c b/src/html.c index b551a1e..e7ccbfb 100644 --- a/src/html.c +++ b/src/html.c @@ -321,6 +321,26 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t print(""); scratch->padded = 0; break; + case BLOCK_DEFINITION: + pad(out, 2, scratch); + print("
"); + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + print("
"); + scratch->padded = 0; + break; + case BLOCK_DEFINITION_GROUP: + mmd_export_token_tree_html(out, source, t->child, t->start + offset, scratch); + break; + case BLOCK_DEFLIST: + pad(out, 2, scratch); + print("
\n"); + scratch->padded = 2; + + mmd_export_token_tree_html(out, source, t->child, t->start + offset, scratch); + pad(out, 1, scratch); + print("
"); + scratch->padded = 0; + break; case BLOCK_CODE_FENCED: case BLOCK_CODE_INDENTED: pad(out, 2, scratch); @@ -456,6 +476,13 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t print("

"); scratch->padded = 0; break; + case BLOCK_TERM: + pad(out, 2, scratch); + print("
"); + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + print("
\n"); + scratch->padded = 2; + break; case BLOCK_TOC: temp_short = 0; temp_short2 = 0; @@ -1020,6 +1047,7 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t break; default: fprintf(stderr, "Unknown token type: %d\n", t->type); + token_describe(t, source); break; } } diff --git a/src/libMultiMarkdown.h b/src/libMultiMarkdown.h index 53894df..571f76c 100644 --- a/src/libMultiMarkdown.h +++ b/src/libMultiMarkdown.h @@ -112,6 +112,9 @@ enum token_types { BLOCK_BLOCKQUOTE = 50, //!< This must start *after* the largest number in parser.h BLOCK_CODE_FENCED, BLOCK_CODE_INDENTED, + BLOCK_DEFLIST, + BLOCK_DEFINITION, + BLOCK_DEFINITION_GROUP, BLOCK_DEF_CITATION, BLOCK_DEF_FOOTNOTE, BLOCK_DEF_LINK, @@ -134,6 +137,7 @@ enum token_types { BLOCK_META, BLOCK_PARA, BLOCK_TABLE, + BLOCK_TERM, BLOCK_TOC, ROW_TABLE, diff --git a/src/mmd.c b/src/mmd.c index c7a21c0..5d0b628 100644 --- a/src/mmd.c +++ b/src/mmd.c @@ -75,6 +75,7 @@ void * ParseAlloc(); void Parse(); void ParseFree(); +void ParseTrace(); void mmd_pair_tokens_in_block(token * block, token_pair_engine * e, stack * s); @@ -328,6 +329,15 @@ void mmd_assign_line_type(mmd_engine * e, token * line) { } line->type = LINE_PLAIN; break; + case COLON: + line->type = LINE_PLAIN; + if (e->extensions & EXT_COMPATIBILITY) { + break; + } + if (scan_definition(&source[line->child->start])) { + line->type = LINE_DEFINITION; + } + break; case HASH1: case HASH2: case HASH3: @@ -759,6 +769,8 @@ void mmd_parse_token_chain(mmd_engine * e, token * chain) { token * walker = chain->child; // Walk the existing tree token * remainder; // Hold unparsed tail of chain +// ParseTrace(stderr, "parser >>"); + // Remove existing token tree e->root = NULL; @@ -772,6 +784,8 @@ void mmd_parse_token_chain(mmd_engine * e, token * chain) { if (remainder) remainder->prev = NULL; +// fprintf(stderr, "\nNew line\n"); + Parse(pParser, walker->type, walker, e); walker = remainder; @@ -808,6 +822,9 @@ void mmd_pair_tokens_in_block(token * block, token_pair_engine * e, stack * s) { switch (block->type) { case BLOCK_BLOCKQUOTE: + case BLOCK_DEFLIST: + case BLOCK_DEFINITION: + case BLOCK_DEFINITION_GROUP: case BLOCK_DEF_CITATION: case BLOCK_DEF_FOOTNOTE: case BLOCK_DEF_LINK: @@ -818,6 +835,7 @@ void mmd_pair_tokens_in_block(token * block, token_pair_engine * e, stack * s) { case BLOCK_H5: case BLOCK_H6: case BLOCK_PARA: + case BLOCK_TERM: token_pairs_match_pairs_inside_token(block, e, s, 0); break; case DOC_START_TOKEN: @@ -874,6 +892,9 @@ void mmd_assign_ambidextrous_tokens_in_block(mmd_engine * e, token * block, cons t->type = BLOCK_PARA; case DOC_START_TOKEN: case BLOCK_BLOCKQUOTE: + case BLOCK_DEFLIST: + case BLOCK_DEFINITION: + case BLOCK_DEFINITION_GROUP: case BLOCK_H1: case BLOCK_H2: case BLOCK_H3: @@ -888,6 +909,7 @@ void mmd_assign_ambidextrous_tokens_in_block(mmd_engine * e, token * block, cons case BLOCK_LIST_ITEM_TIGHT: case BLOCK_PARA: case BLOCK_TABLE: + case BLOCK_TERM: // Assign child tokens of blocks mmd_assign_ambidextrous_tokens_in_block(e, t, str, start_offset); break; @@ -1374,6 +1396,41 @@ void strip_line_tokens_from_metadata(mmd_engine * e, token * metadata) { } +void strip_line_tokens_from_defgroup(mmd_engine * e, token * group) { + token * walker = group->child; + + while (walker) { + switch (walker->type) { + case LINE_PLAIN: + walker->type = BLOCK_TERM; + case BLOCK_TERM: + break; + case BLOCK_DEFINITION: + strip_line_tokens_from_block(e, walker); + break; + } + walker = walker->next; + } +} + + +void strip_line_tokens_from_deflist(mmd_engine * e, token * deflist) { + token * walker = deflist->child; + + while (walker) { + switch (walker->type) { + case LINE_EMPTY: + walker->type = TEXT_EMPTY; + break; + case BLOCK_DEFINITION_GROUP: + strip_line_tokens_from_defgroup(e, walker); + break; + } + walker = walker->next; + } +} + + void strip_line_tokens_from_block(mmd_engine * e, token * block) { if ((block == NULL) || (block->child == NULL)) return; @@ -1395,6 +1452,9 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { while (l->tail->type == LINE_EMPTY) token_remove_last_child(block); break; + case BLOCK_DEFLIST: + // Handle definition lists + return strip_line_tokens_from_deflist(e, block); } token * children = NULL; @@ -1405,6 +1465,11 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { // Move contents of line directly into the parent block while (l != NULL) { switch (l->type) { + case LINE_DEFINITION: + if (block->type == BLOCK_DEFINITION) { + // Remove leading colon + token_remove_first_child(l); + } case LINE_ATX_1: case LINE_ATX_2: case LINE_ATX_3: @@ -1454,6 +1519,7 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { l->type = ROW_TABLE; break; default: + //fprintf(stderr, "Unspecified line type %d inside block type %d\n", l->type, block->type); // This is a block, need to remove it from chain and // Add to parent temp = l->next; diff --git a/src/parser.c b/src/parser.c index c6ec537..da0aaae 100644 --- a/src/parser.c +++ b/src/parser.c @@ -92,7 +92,7 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 59 +#define YYNOCODE 65 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE token * typedef union { @@ -107,16 +107,16 @@ typedef union { #define ParseARG_FETCH mmd_engine * engine = yypParser->engine #define ParseARG_STORE yypParser->engine = engine #define YYFALLBACK 1 -#define YYNSTATE 40 -#define YYNRULE 93 -#define YY_MAX_SHIFT 39 -#define YY_MIN_SHIFTREDUCE 96 -#define YY_MAX_SHIFTREDUCE 188 -#define YY_MIN_REDUCE 189 -#define YY_MAX_REDUCE 281 -#define YY_ERROR_ACTION 282 -#define YY_ACCEPT_ACTION 283 -#define YY_NO_ACTION 284 +#define YYNSTATE 47 +#define YYNRULE 103 +#define YY_MAX_SHIFT 46 +#define YY_MIN_SHIFTREDUCE 107 +#define YY_MAX_SHIFTREDUCE 209 +#define YY_MIN_REDUCE 210 +#define YY_MAX_REDUCE 312 +#define YY_ERROR_ACTION 313 +#define YY_ACCEPT_ACTION 314 +#define YY_NO_ACTION 315 /************* End control #defines *******************************************/ /* Define the yytestcase() macro to be a no-op if is not already defined @@ -188,72 +188,79 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (174) +#define YY_ACTTAB_COUNT (191) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 189, 165, 21, 159, 160, 14, 101, 102, 103, 104, - /* 10 */ 105, 106, 112, 15, 5, 4, 174, 3, 2, 16, - /* 20 */ 13, 12, 119, 165, 11, 21, 159, 160, 14, 101, - /* 30 */ 102, 103, 104, 105, 106, 112, 15, 5, 4, 174, - /* 40 */ 3, 2, 16, 13, 12, 119, 165, 11, 283, 1, - /* 50 */ 98, 99, 10, 39, 37, 35, 110, 38, 113, 114, - /* 60 */ 115, 116, 117, 118, 122, 122, 188, 30, 30, 158, - /* 70 */ 37, 153, 35, 97, 99, 10, 39, 37, 35, 110, - /* 80 */ 38, 113, 114, 115, 116, 117, 118, 29, 26, 187, - /* 90 */ 29, 163, 164, 37, 29, 35, 180, 158, 6, 6, - /* 100 */ 181, 7, 7, 155, 29, 17, 121, 17, 19, 29, - /* 110 */ 19, 162, 18, 29, 18, 8, 8, 183, 29, 165, - /* 120 */ 9, 9, 22, 183, 22, 121, 125, 24, 148, 24, - /* 130 */ 121, 20, 121, 20, 29, 131, 23, 191, 23, 184, - /* 140 */ 183, 169, 151, 31, 31, 184, 121, 27, 27, 163, - /* 150 */ 164, 29, 25, 168, 25, 5, 28, 28, 4, 149, - /* 160 */ 32, 32, 184, 33, 33, 34, 34, 36, 36, 123, - /* 170 */ 139, 136, 126, 123, + /* 0 */ 210, 183, 23, 181, 182, 14, 112, 113, 114, 115, + /* 10 */ 116, 117, 123, 15, 5, 4, 192, 3, 2, 17, + /* 20 */ 13, 12, 130, 183, 11, 23, 181, 182, 14, 112, + /* 30 */ 113, 114, 115, 116, 117, 123, 15, 5, 4, 192, + /* 40 */ 3, 2, 17, 13, 12, 130, 183, 11, 314, 1, + /* 50 */ 109, 29, 10, 45, 41, 39, 121, 44, 124, 125, + /* 60 */ 126, 127, 128, 129, 38, 134, 134, 177, 10, 33, + /* 70 */ 33, 41, 42, 39, 30, 30, 31, 31, 34, 34, + /* 80 */ 28, 38, 108, 29, 10, 45, 41, 39, 121, 44, + /* 90 */ 124, 125, 126, 127, 128, 129, 38, 32, 177, 165, + /* 100 */ 10, 181, 182, 41, 198, 39, 160, 187, 199, 6, + /* 110 */ 6, 23, 201, 38, 32, 167, 18, 32, 18, 186, + /* 120 */ 183, 180, 201, 137, 32, 133, 7, 7, 32, 8, + /* 130 */ 8, 163, 135, 20, 202, 20, 24, 133, 24, 206, + /* 140 */ 9, 9, 32, 19, 202, 19, 32, 26, 22, 26, + /* 150 */ 4, 32, 143, 181, 182, 133, 16, 201, 5, 133, + /* 160 */ 32, 21, 205, 21, 133, 25, 138, 25, 35, 35, + /* 170 */ 27, 209, 27, 135, 36, 36, 161, 171, 168, 202, + /* 180 */ 46, 148, 151, 43, 43, 37, 37, 40, 40, 174, + /* 190 */ 135, }; static const YYCODETYPE yy_lookahead[] = { /* 0 */ 0, 23, 2, 3, 4, 5, 6, 7, 8, 9, /* 10 */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 20 */ 20, 21, 22, 23, 24, 2, 3, 4, 5, 6, /* 30 */ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 40 */ 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, - /* 50 */ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - /* 60 */ 38, 39, 40, 41, 44, 45, 1, 56, 57, 1, - /* 70 */ 48, 55, 50, 28, 29, 30, 31, 32, 33, 34, - /* 80 */ 35, 36, 37, 38, 39, 40, 41, 31, 45, 24, - /* 90 */ 31, 3, 4, 48, 31, 50, 1, 1, 42, 43, - /* 100 */ 5, 42, 43, 57, 31, 49, 43, 51, 49, 31, - /* 110 */ 51, 23, 49, 31, 51, 42, 43, 1, 31, 23, - /* 120 */ 42, 43, 49, 1, 51, 43, 47, 49, 53, 51, - /* 130 */ 43, 49, 43, 51, 31, 50, 49, 58, 51, 23, - /* 140 */ 1, 1, 20, 52, 53, 23, 43, 54, 55, 3, - /* 150 */ 4, 31, 49, 13, 51, 14, 54, 55, 15, 20, - /* 160 */ 46, 47, 23, 42, 43, 42, 43, 42, 43, 23, - /* 170 */ 16, 51, 48, 23, + /* 40 */ 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, + /* 50 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + /* 60 */ 39, 40, 41, 42, 43, 46, 47, 1, 47, 58, + /* 70 */ 59, 50, 25, 52, 56, 57, 56, 57, 54, 55, + /* 80 */ 47, 60, 29, 30, 31, 32, 33, 34, 35, 36, + /* 90 */ 37, 38, 39, 40, 41, 42, 43, 32, 1, 57, + /* 100 */ 47, 3, 4, 50, 1, 52, 55, 1, 5, 44, + /* 110 */ 45, 2, 1, 60, 32, 59, 51, 32, 53, 13, + /* 120 */ 23, 23, 1, 49, 32, 45, 44, 45, 32, 44, + /* 130 */ 45, 20, 23, 51, 23, 53, 51, 45, 53, 1, + /* 140 */ 44, 45, 32, 51, 23, 53, 32, 51, 30, 53, + /* 150 */ 15, 32, 52, 3, 4, 45, 32, 1, 14, 45, + /* 160 */ 32, 51, 24, 53, 45, 51, 50, 53, 48, 49, + /* 170 */ 51, 1, 53, 23, 44, 45, 20, 62, 60, 23, + /* 180 */ 63, 53, 16, 61, 62, 44, 45, 44, 45, 1, + /* 190 */ 23, }; -#define YY_SHIFT_USE_DFLT (174) -#define YY_SHIFT_COUNT (39) +#define YY_SHIFT_USE_DFLT (191) +#define YY_SHIFT_COUNT (46) #define YY_SHIFT_MIN (-22) -#define YY_SHIFT_MAX (154) +#define YY_SHIFT_MAX (188) static const short yy_shift_ofst[] = { - /* 0 */ 23, 0, 96, 96, 96, 96, 96, 96, 96, 96, - /* 10 */ 88, 65, 116, 116, 95, 140, 68, -22, -22, -22, - /* 20 */ -22, 68, -22, -22, -22, -22, 68, 122, 139, 146, - /* 30 */ 65, 95, 140, 68, 68, 143, 68, 141, 154, 150, + /* 0 */ 23, 0, 97, 97, 97, 97, 97, 97, 97, 97, + /* 10 */ 98, 138, 121, 121, 103, 106, 109, 66, -22, -22, + /* 20 */ -22, -22, 47, 66, -22, -22, -22, -22, 66, 47, + /* 30 */ 111, 156, 150, 138, 103, 106, 66, 66, -22, 135, + /* 40 */ 66, 144, 170, 47, 166, 167, 188, }; #define YY_REDUCE_USE_DFLT (-1) -#define YY_REDUCE_COUNT (37) +#define YY_REDUCE_COUNT (43) #define YY_REDUCE_MIN (0) -#define YY_REDUCE_MAX (125) -static const signed char yy_reduce_ofst[] = { - /* 0 */ 22, 45, 56, 59, 73, 78, 63, 82, 87, 103, - /* 10 */ 20, 11, 93, 102, 91, 114, 121, 120, 120, 120, - /* 20 */ 120, 123, 120, 120, 120, 120, 125, 16, 16, 43, - /* 30 */ 46, 75, 79, 89, 89, 85, 89, 124, +#define YY_REDUCE_MAX (143) +static const short yy_reduce_ofst[] = { + /* 0 */ 21, 53, 65, 82, 85, 96, 92, 110, 114, 119, + /* 10 */ 19, 11, 18, 20, 24, 120, 118, 130, 128, 128, + /* 20 */ 128, 128, 122, 141, 128, 128, 128, 128, 143, 122, + /* 30 */ 42, 42, 33, 56, 51, 74, 80, 80, 124, 100, + /* 40 */ 80, 116, 117, 115, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 282, 282, 269, 268, 228, 223, 237, 234, 226, 221, - /* 10 */ 193, 278, 282, 282, 271, 259, 270, 238, 236, 235, - /* 20 */ 233, 249, 227, 225, 222, 220, 231, 245, 243, 266, - /* 30 */ 247, 240, 217, 239, 213, 202, 230, 201, 204, 200, + /* 0 */ 313, 313, 297, 296, 250, 245, 259, 256, 248, 243, + /* 10 */ 214, 306, 313, 313, 299, 287, 272, 298, 260, 258, + /* 20 */ 257, 255, 313, 278, 249, 247, 244, 242, 253, 213, + /* 30 */ 267, 265, 294, 269, 262, 239, 261, 235, 234, 223, + /* 40 */ 252, 222, 276, 273, 225, 221, 275, }; /********** End of lemon-generated parsing tables *****************************/ @@ -386,15 +393,16 @@ static const char *const yyTokenName[] = { "LINE_HR", "LINE_BLOCKQUOTE", "LINE_LIST_BULLETED", "LINE_LIST_ENUMERATED", "LINE_TABLE", "LINE_DEF_CITATION", "LINE_DEF_FOOTNOTE", "LINE_DEF_LINK", "LINE_FENCE_BACKTICK", "LINE_FENCE_BACKTICK_START", "LINE_TOC", "LINE_EMPTY", - "LINE_META", "error", "doc", "blocks", - "block", "para", "indented_code", "empty", - "list_bulleted", "list_enumerated", "blockquote", "table", - "def_citation", "def_footnote", "def_link", "html_block", - "fenced_block", "meta_block", "para_lines", "para_line", - "code_line", "indented_line", "quote_lines", "quote_line", - "item_bulleted", "cont_blocks", "item_enumerated", "cont_block", - "html_block_lines", "html_block_line", "fenced_lines", "fenced_line", - "meta_lines", "meta_line", + "LINE_META", "LINE_DEFINITION", "error", "doc", + "blocks", "block", "para", "indented_code", + "empty", "list_bulleted", "list_enumerated", "blockquote", + "table", "def_citation", "def_footnote", "def_link", + "html_block", "fenced_block", "meta_block", "definition_block", + "para_lines", "para_line", "code_line", "indented_line", + "quote_lines", "quote_line", "item_bulleted", "cont_blocks", + "item_enumerated", "cont_block", "html_block_lines", "html_block_line", + "fenced_lines", "fenced_line", "meta_lines", "meta_line", + "definition", "defs", "def", "def_lines", }; #endif /* NDEBUG */ @@ -426,75 +434,85 @@ static const char *const yyRuleName[] = { /* 21 */ "block ::= fenced_block", /* 22 */ "block ::= meta_block", /* 23 */ "block ::= LINE_TOC", - /* 24 */ "para ::= LINE_PLAIN para_lines", - /* 25 */ "para_lines ::= para_lines para_line", - /* 26 */ "indented_code ::= indented_code code_line", - /* 27 */ "empty ::= empty LINE_EMPTY", - /* 28 */ "blockquote ::= LINE_BLOCKQUOTE quote_lines", - /* 29 */ "quote_lines ::= quote_lines quote_line", - /* 30 */ "list_bulleted ::= list_bulleted item_bulleted", - /* 31 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks", - /* 32 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines", - /* 33 */ "item_bulleted ::= LINE_LIST_BULLETED cont_blocks", - /* 34 */ "item_bulleted ::= LINE_LIST_BULLETED", - /* 35 */ "list_enumerated ::= list_enumerated item_enumerated", - /* 36 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks", - /* 37 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines", - /* 38 */ "item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks", - /* 39 */ "item_enumerated ::= LINE_LIST_ENUMERATED", - /* 40 */ "cont_blocks ::= cont_blocks cont_block", - /* 41 */ "cont_block ::= empty indented_line para_lines", - /* 42 */ "cont_block ::= empty indented_line", - /* 43 */ "table ::= table LINE_TABLE", - /* 44 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks", - /* 45 */ "def_citation ::= LINE_DEF_CITATION para_lines", - /* 46 */ "def_citation ::= LINE_DEF_CITATION cont_blocks", - /* 47 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks", - /* 48 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines", - /* 49 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks", - /* 50 */ "def_link ::= LINE_DEF_LINK para_lines", - /* 51 */ "html_block ::= LINE_HTML html_block_lines", - /* 52 */ "html_block_lines ::= html_block_lines html_block_line", - /* 53 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK", - /* 54 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines", - /* 55 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK", - /* 56 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines", - /* 57 */ "fenced_lines ::= fenced_lines fenced_line", - /* 58 */ "meta_block ::= LINE_META meta_lines", - /* 59 */ "meta_lines ::= meta_lines meta_line", - /* 60 */ "para ::= LINE_PLAIN", - /* 61 */ "para_lines ::= para_line", - /* 62 */ "para_line ::= LINE_CONTINUATION", - /* 63 */ "indented_code ::= LINE_INDENTED_TAB", - /* 64 */ "indented_code ::= LINE_INDENTED_SPACE", - /* 65 */ "code_line ::= indented_line", - /* 66 */ "code_line ::= LINE_EMPTY", - /* 67 */ "indented_line ::= LINE_INDENTED_TAB", - /* 68 */ "indented_line ::= LINE_INDENTED_SPACE", - /* 69 */ "empty ::= LINE_EMPTY", - /* 70 */ "blockquote ::= LINE_BLOCKQUOTE", - /* 71 */ "quote_lines ::= quote_line", - /* 72 */ "quote_line ::= LINE_BLOCKQUOTE", - /* 73 */ "quote_line ::= LINE_CONTINUATION", - /* 74 */ "list_bulleted ::= item_bulleted", - /* 75 */ "list_enumerated ::= item_enumerated", - /* 76 */ "cont_blocks ::= cont_block", - /* 77 */ "cont_block ::= empty", - /* 78 */ "table ::= LINE_TABLE", - /* 79 */ "def_citation ::= LINE_DEF_CITATION", - /* 80 */ "def_footnote ::= LINE_DEF_FOOTNOTE", - /* 81 */ "def_link ::= LINE_DEF_LINK", - /* 82 */ "html_block ::= LINE_HTML", - /* 83 */ "html_block_lines ::= html_block_line", - /* 84 */ "html_block_line ::= LINE_CONTINUATION", - /* 85 */ "html_block_line ::= LINE_HTML", - /* 86 */ "fenced_lines ::= fenced_line", - /* 87 */ "fenced_line ::= LINE_CONTINUATION", - /* 88 */ "fenced_line ::= LINE_EMPTY", - /* 89 */ "meta_block ::= LINE_META", - /* 90 */ "meta_lines ::= meta_line", - /* 91 */ "meta_line ::= LINE_META", - /* 92 */ "meta_line ::= LINE_CONTINUATION", + /* 24 */ "block ::= definition_block", + /* 25 */ "para ::= LINE_PLAIN para_lines", + /* 26 */ "para_lines ::= para_lines para_line", + /* 27 */ "indented_code ::= indented_code code_line", + /* 28 */ "empty ::= empty LINE_EMPTY", + /* 29 */ "blockquote ::= LINE_BLOCKQUOTE quote_lines", + /* 30 */ "quote_lines ::= quote_lines quote_line", + /* 31 */ "list_bulleted ::= list_bulleted item_bulleted", + /* 32 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks", + /* 33 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines", + /* 34 */ "item_bulleted ::= LINE_LIST_BULLETED cont_blocks", + /* 35 */ "item_bulleted ::= LINE_LIST_BULLETED", + /* 36 */ "list_enumerated ::= list_enumerated item_enumerated", + /* 37 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks", + /* 38 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines", + /* 39 */ "item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks", + /* 40 */ "item_enumerated ::= LINE_LIST_ENUMERATED", + /* 41 */ "cont_blocks ::= cont_blocks cont_block", + /* 42 */ "cont_block ::= empty indented_line para_lines", + /* 43 */ "cont_block ::= empty indented_line", + /* 44 */ "table ::= table LINE_TABLE", + /* 45 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks", + /* 46 */ "def_citation ::= LINE_DEF_CITATION para_lines", + /* 47 */ "def_citation ::= LINE_DEF_CITATION cont_blocks", + /* 48 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks", + /* 49 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines", + /* 50 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks", + /* 51 */ "def_link ::= LINE_DEF_LINK para_lines", + /* 52 */ "html_block ::= LINE_HTML html_block_lines", + /* 53 */ "html_block_lines ::= html_block_lines html_block_line", + /* 54 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK", + /* 55 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines", + /* 56 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK", + /* 57 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines", + /* 58 */ "fenced_lines ::= fenced_lines fenced_line", + /* 59 */ "meta_block ::= LINE_META meta_lines", + /* 60 */ "meta_lines ::= meta_lines meta_line", + /* 61 */ "definition_block ::= definition_block empty definition", + /* 62 */ "definition_block ::= definition_block empty", + /* 63 */ "definition ::= para defs", + /* 64 */ "defs ::= defs def", + /* 65 */ "def ::= LINE_DEFINITION def_lines", + /* 66 */ "def ::= LINE_DEFINITION", + /* 67 */ "def_lines ::= def_lines LINE_CONTINUATION", + /* 68 */ "para ::= LINE_PLAIN", + /* 69 */ "para_lines ::= para_line", + /* 70 */ "para_line ::= LINE_CONTINUATION", + /* 71 */ "indented_code ::= indented_line", + /* 72 */ "code_line ::= indented_line", + /* 73 */ "code_line ::= LINE_EMPTY", + /* 74 */ "indented_line ::= LINE_INDENTED_TAB", + /* 75 */ "indented_line ::= LINE_INDENTED_SPACE", + /* 76 */ "empty ::= LINE_EMPTY", + /* 77 */ "blockquote ::= LINE_BLOCKQUOTE", + /* 78 */ "quote_lines ::= quote_line", + /* 79 */ "quote_line ::= LINE_BLOCKQUOTE", + /* 80 */ "quote_line ::= LINE_CONTINUATION", + /* 81 */ "list_bulleted ::= item_bulleted", + /* 82 */ "list_enumerated ::= item_enumerated", + /* 83 */ "cont_blocks ::= cont_block", + /* 84 */ "cont_block ::= empty", + /* 85 */ "table ::= LINE_TABLE", + /* 86 */ "def_citation ::= LINE_DEF_CITATION", + /* 87 */ "def_footnote ::= LINE_DEF_FOOTNOTE", + /* 88 */ "def_link ::= LINE_DEF_LINK", + /* 89 */ "html_block ::= LINE_HTML", + /* 90 */ "html_block_lines ::= html_block_line", + /* 91 */ "html_block_line ::= LINE_CONTINUATION", + /* 92 */ "html_block_line ::= LINE_HTML", + /* 93 */ "fenced_lines ::= fenced_line", + /* 94 */ "fenced_line ::= LINE_CONTINUATION", + /* 95 */ "fenced_line ::= LINE_EMPTY", + /* 96 */ "meta_block ::= LINE_META", + /* 97 */ "meta_lines ::= meta_line", + /* 98 */ "meta_line ::= LINE_META", + /* 99 */ "meta_line ::= LINE_CONTINUATION", + /* 100 */ "definition_block ::= definition", + /* 101 */ "defs ::= def", + /* 102 */ "def_lines ::= LINE_CONTINUATION", }; #endif /* NDEBUG */ @@ -843,99 +861,109 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ unsigned char nrhs; /* Number of right-hand side symbols in the rule */ } yyRuleInfo[] = { - { 26, 1 }, - { 27, 2 }, { 27, 1 }, + { 28, 2 }, { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 28, 1 }, - { 29, 2 }, - { 42, 2 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, + { 29, 1 }, { 30, 2 }, + { 44, 2 }, { 31, 2 }, - { 34, 2 }, - { 46, 2 }, { 32, 2 }, - { 48, 3 }, - { 48, 2 }, + { 35, 2 }, { 48, 2 }, - { 48, 1 }, { 33, 2 }, { 50, 3 }, { 50, 2 }, { 50, 2 }, { 50, 1 }, - { 49, 2 }, - { 51, 3 }, + { 34, 2 }, + { 52, 3 }, + { 52, 2 }, + { 52, 2 }, + { 52, 1 }, { 51, 2 }, - { 35, 2 }, - { 36, 3 }, - { 36, 2 }, + { 53, 3 }, + { 53, 2 }, { 36, 2 }, { 37, 3 }, { 37, 2 }, { 37, 2 }, + { 38, 3 }, + { 38, 2 }, { 38, 2 }, { 39, 2 }, - { 52, 2 }, - { 40, 3 }, - { 40, 2 }, - { 40, 3 }, { 40, 2 }, { 54, 2 }, + { 41, 3 }, + { 41, 2 }, + { 41, 3 }, { 41, 2 }, { 56, 2 }, - { 29, 1 }, - { 42, 1 }, - { 43, 1 }, - { 30, 1 }, + { 42, 2 }, + { 58, 2 }, + { 43, 3 }, + { 43, 2 }, + { 60, 2 }, + { 61, 2 }, + { 62, 2 }, + { 62, 1 }, + { 63, 2 }, { 30, 1 }, { 44, 1 }, - { 44, 1 }, - { 45, 1 }, { 45, 1 }, { 31, 1 }, - { 34, 1 }, + { 46, 1 }, { 46, 1 }, { 47, 1 }, { 47, 1 }, { 32, 1 }, - { 33, 1 }, + { 35, 1 }, + { 48, 1 }, { 49, 1 }, + { 49, 1 }, + { 33, 1 }, + { 34, 1 }, { 51, 1 }, - { 35, 1 }, + { 53, 1 }, { 36, 1 }, { 37, 1 }, { 38, 1 }, { 39, 1 }, - { 52, 1 }, - { 53, 1 }, - { 53, 1 }, + { 40, 1 }, { 54, 1 }, { 55, 1 }, { 55, 1 }, - { 41, 1 }, { 56, 1 }, { 57, 1 }, { 57, 1 }, + { 42, 1 }, + { 58, 1 }, + { 59, 1 }, + { 59, 1 }, + { 43, 1 }, + { 61, 1 }, + { 63, 1 }, }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1108,106 +1136,128 @@ static void yy_reduce( { yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_TOC); } yymsp[0].minor.yy0 = yylhsminor.yy0; break; - case 24: /* para ::= LINE_PLAIN para_lines */ - case 25: /* para_lines ::= para_lines para_line */ yytestcase(yyruleno==25); - case 26: /* indented_code ::= indented_code code_line */ yytestcase(yyruleno==26); - case 27: /* empty ::= empty LINE_EMPTY */ yytestcase(yyruleno==27); - case 28: /* blockquote ::= LINE_BLOCKQUOTE quote_lines */ yytestcase(yyruleno==28); - case 29: /* quote_lines ::= quote_lines quote_line */ yytestcase(yyruleno==29); - case 30: /* list_bulleted ::= list_bulleted item_bulleted */ yytestcase(yyruleno==30); - case 35: /* list_enumerated ::= list_enumerated item_enumerated */ yytestcase(yyruleno==35); - case 40: /* cont_blocks ::= cont_blocks cont_block */ yytestcase(yyruleno==40); - case 43: /* table ::= table LINE_TABLE */ yytestcase(yyruleno==43); - case 45: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==45); - case 46: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==46); - case 48: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==48); - case 49: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==49); - case 50: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==50); - case 51: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==51); - case 52: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==52); - case 54: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==54); - case 56: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==56); - case 57: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==57); - case 58: /* meta_block ::= LINE_META meta_lines */ yytestcase(yyruleno==58); - case 59: /* meta_lines ::= meta_lines meta_line */ yytestcase(yyruleno==59); + case 24: /* block ::= definition_block */ +{ yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_DEFLIST); } + yymsp[0].minor.yy0 = yylhsminor.yy0; + break; + case 25: /* para ::= LINE_PLAIN para_lines */ + case 26: /* para_lines ::= para_lines para_line */ yytestcase(yyruleno==26); + case 27: /* indented_code ::= indented_code code_line */ yytestcase(yyruleno==27); + case 28: /* empty ::= empty LINE_EMPTY */ yytestcase(yyruleno==28); + case 29: /* blockquote ::= LINE_BLOCKQUOTE quote_lines */ yytestcase(yyruleno==29); + case 30: /* quote_lines ::= quote_lines quote_line */ yytestcase(yyruleno==30); + case 31: /* list_bulleted ::= list_bulleted item_bulleted */ yytestcase(yyruleno==31); + case 36: /* list_enumerated ::= list_enumerated item_enumerated */ yytestcase(yyruleno==36); + case 41: /* cont_blocks ::= cont_blocks cont_block */ yytestcase(yyruleno==41); + case 44: /* table ::= table LINE_TABLE */ yytestcase(yyruleno==44); + case 46: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==46); + case 47: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==47); + case 49: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==49); + case 50: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==50); + case 51: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==51); + case 52: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==52); + case 53: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==53); + case 55: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==55); + case 57: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==57); + case 58: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==58); + case 59: /* meta_block ::= LINE_META meta_lines */ yytestcase(yyruleno==59); + case 60: /* meta_lines ::= meta_lines meta_line */ yytestcase(yyruleno==60); + case 62: /* definition_block ::= definition_block empty */ yytestcase(yyruleno==62); + case 64: /* defs ::= defs def */ yytestcase(yyruleno==64); + case 67: /* def_lines ::= def_lines LINE_CONTINUATION */ yytestcase(yyruleno==67); { yylhsminor.yy0 = yymsp[-1].minor.yy0; token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 31: /* item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks */ - case 36: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks */ yytestcase(yyruleno==36); + case 32: /* item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks */ + case 37: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks */ yytestcase(yyruleno==37); { token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-2].minor.yy0, BLOCK_LIST_ITEM); recursive_parse_list_item(engine, yylhsminor.yy0); } yymsp[-2].minor.yy0 = yylhsminor.yy0; break; - case 32: /* item_bulleted ::= LINE_LIST_BULLETED para_lines */ - case 37: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines */ yytestcase(yyruleno==37); + case 33: /* item_bulleted ::= LINE_LIST_BULLETED para_lines */ + case 38: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines */ yytestcase(yyruleno==38); { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM_TIGHT); recursive_parse_list_item(engine, yylhsminor.yy0); } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 33: /* item_bulleted ::= LINE_LIST_BULLETED cont_blocks */ + case 34: /* item_bulleted ::= LINE_LIST_BULLETED cont_blocks */ { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM); if (yymsp[0].minor.yy0) {recursive_parse_list_item(engine, yylhsminor.yy0);} } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 34: /* item_bulleted ::= LINE_LIST_BULLETED */ - case 39: /* item_enumerated ::= LINE_LIST_ENUMERATED */ yytestcase(yyruleno==39); + case 35: /* item_bulleted ::= LINE_LIST_BULLETED */ + case 40: /* item_enumerated ::= LINE_LIST_ENUMERATED */ yytestcase(yyruleno==40); { yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_LIST_ITEM_TIGHT); } yymsp[0].minor.yy0 = yylhsminor.yy0; break; - case 38: /* item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks */ + case 39: /* item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks */ { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM); recursive_parse_list_item(engine, yylhsminor.yy0); } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 41: /* cont_block ::= empty indented_line para_lines */ + case 42: /* cont_block ::= empty indented_line para_lines */ { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yymsp[-1].minor.yy0->type = LINE_CONTINUATION; } yymsp[-2].minor.yy0 = yylhsminor.yy0; break; - case 42: /* cont_block ::= empty indented_line */ + case 43: /* cont_block ::= empty indented_line */ { yylhsminor.yy0 = yymsp[-1].minor.yy0; token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yymsp[0].minor.yy0->type = LINE_CONTINUATION; } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 44: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */ - case 47: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==47); + case 45: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */ + case 48: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==48); + case 61: /* definition_block ::= definition_block empty definition */ yytestcase(yyruleno==61); { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); } yymsp[-2].minor.yy0 = yylhsminor.yy0; break; - case 53: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */ - case 55: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==55); + case 54: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */ + case 56: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==56); { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yymsp[0].minor.yy0->child->type = CODE_FENCE; } yymsp[-2].minor.yy0 = yylhsminor.yy0; break; + case 63: /* definition ::= para defs */ +{ yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_DEFINITION_GROUP); token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yymsp[-1].minor.yy0->type = BLOCK_TERM; } + yymsp[-1].minor.yy0 = yylhsminor.yy0; + break; + case 65: /* def ::= LINE_DEFINITION def_lines */ +{ yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_DEFINITION); token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); } + yymsp[-1].minor.yy0 = yylhsminor.yy0; + break; + case 66: /* def ::= LINE_DEFINITION */ +{ yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_DEFINITION); } + yymsp[0].minor.yy0 = yylhsminor.yy0; + break; default: - /* (60) para ::= LINE_PLAIN */ yytestcase(yyruleno==60); - /* (61) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=61); - /* (62) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==62); - /* (63) indented_code ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==63); - /* (64) indented_code ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==64); - /* (65) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=65); - /* (66) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==66); - /* (67) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==67); - /* (68) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==68); - /* (69) empty ::= LINE_EMPTY */ yytestcase(yyruleno==69); - /* (70) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==70); - /* (71) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=71); - /* (72) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==72); - /* (73) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==73); - /* (74) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=74); - /* (75) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=75); - /* (76) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=76); - /* (77) cont_block ::= empty */ yytestcase(yyruleno==77); - /* (78) table ::= LINE_TABLE */ yytestcase(yyruleno==78); - /* (79) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==79); - /* (80) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==80); - /* (81) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==81); - /* (82) html_block ::= LINE_HTML */ yytestcase(yyruleno==82); - /* (83) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=83); - /* (84) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==84); - /* (85) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==85); - /* (86) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=86); - /* (87) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==87); - /* (88) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==88); - /* (89) meta_block ::= LINE_META */ yytestcase(yyruleno==89); - /* (90) meta_lines ::= meta_line (OPTIMIZED OUT) */ assert(yyruleno!=90); - /* (91) meta_line ::= LINE_META */ yytestcase(yyruleno==91); - /* (92) meta_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==92); + /* (68) para ::= LINE_PLAIN */ yytestcase(yyruleno==68); + /* (69) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=69); + /* (70) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==70); + /* (71) indented_code ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=71); + /* (72) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=72); + /* (73) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==73); + /* (74) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==74); + /* (75) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==75); + /* (76) empty ::= LINE_EMPTY */ yytestcase(yyruleno==76); + /* (77) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==77); + /* (78) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=78); + /* (79) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==79); + /* (80) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==80); + /* (81) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=81); + /* (82) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=82); + /* (83) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=83); + /* (84) cont_block ::= empty */ yytestcase(yyruleno==84); + /* (85) table ::= LINE_TABLE */ yytestcase(yyruleno==85); + /* (86) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==86); + /* (87) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==87); + /* (88) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==88); + /* (89) html_block ::= LINE_HTML */ yytestcase(yyruleno==89); + /* (90) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=90); + /* (91) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==91); + /* (92) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==92); + /* (93) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=93); + /* (94) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==94); + /* (95) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==95); + /* (96) meta_block ::= LINE_META */ yytestcase(yyruleno==96); + /* (97) meta_lines ::= meta_line (OPTIMIZED OUT) */ assert(yyruleno!=97); + /* (98) meta_line ::= LINE_META */ yytestcase(yyruleno==98); + /* (99) meta_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==99); + /* (100) definition_block ::= definition (OPTIMIZED OUT) */ assert(yyruleno!=100); + /* (101) defs ::= def (OPTIMIZED OUT) */ assert(yyruleno!=101); + /* (102) def_lines ::= LINE_CONTINUATION */ yytestcase(yyruleno==102); break; /********** End reduce actions ************************************************/ }; diff --git a/src/parser.h b/src/parser.h index e4493c1..8fbed60 100644 --- a/src/parser.h +++ b/src/parser.h @@ -22,3 +22,4 @@ #define LINE_TOC 22 #define LINE_EMPTY 23 #define LINE_META 24 +#define LINE_DEFINITION 25 diff --git a/src/parser.out b/src/parser.out index 41bccb8..5fcdbc3 100644 --- a/src/parser.out +++ b/src/parser.out @@ -23,11 +23,13 @@ State 0: block ::= * fenced_block block ::= * meta_block block ::= * LINE_TOC + block ::= * definition_block para ::= * LINE_PLAIN para_lines para ::= * LINE_PLAIN indented_code ::= * indented_code code_line - indented_code ::= * LINE_INDENTED_TAB - indented_code ::= * LINE_INDENTED_SPACE + indented_code ::= * indented_line + indented_line ::= * LINE_INDENTED_TAB + indented_line ::= * LINE_INDENTED_SPACE empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY blockquote ::= * LINE_BLOCKQUOTE quote_lines @@ -64,10 +66,14 @@ State 0: fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines meta_block ::= * LINE_META meta_lines meta_block ::= * LINE_META - - LINE_PLAIN shift 21 - LINE_INDENTED_TAB shift-reduce 63 indented_code ::= LINE_INDENTED_TAB - LINE_INDENTED_SPACE shift-reduce 64 indented_code ::= LINE_INDENTED_SPACE + definition_block ::= * definition_block empty definition + definition_block ::= * definition_block empty + definition_block ::= * definition + definition ::= * para defs + + LINE_PLAIN shift 23 + LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE LINE_HTML shift 14 LINE_ATX_1 shift-reduce 5 block ::= LINE_ATX_1 LINE_ATX_2 shift-reduce 6 block ::= LINE_ATX_2 @@ -79,33 +85,36 @@ State 0: LINE_BLOCKQUOTE shift 15 LINE_LIST_BULLETED shift 5 LINE_LIST_ENUMERATED shift 4 - LINE_TABLE shift-reduce 78 table ::= LINE_TABLE + LINE_TABLE shift-reduce 85 table ::= LINE_TABLE LINE_DEF_CITATION shift 3 LINE_DEF_FOOTNOTE shift 2 - LINE_DEF_LINK shift 16 + LINE_DEF_LINK shift 17 LINE_FENCE_BACKTICK shift 13 LINE_FENCE_BACKTICK_START shift 12 LINE_TOC shift-reduce 23 block ::= LINE_TOC - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY LINE_META shift 11 doc accept blocks shift 1 block shift-reduce 2 blocks ::= block - para shift-reduce 3 block ::= para + para shift 29 indented_code shift 10 - empty shift 39 - list_bulleted shift 37 - list_enumerated shift 35 + empty shift 45 + list_bulleted shift 41 + list_enumerated shift 39 blockquote shift-reduce 14 block ::= blockquote - table shift 38 + table shift 44 def_citation shift-reduce 17 block ::= def_citation def_footnote shift-reduce 18 block ::= def_footnote def_link shift-reduce 19 block ::= def_link html_block shift-reduce 20 block ::= html_block fenced_block shift-reduce 21 block ::= fenced_block meta_block shift-reduce 22 block ::= meta_block - item_bulleted shift 37 /* because item_bulleted==list_bulleted */ - item_enumerated shift 35 /* because item_enumerated==list_enumerated */ + definition_block shift 38 + indented_line shift 10 /* because indented_line==indented_code */ + item_bulleted shift 41 /* because item_bulleted==list_bulleted */ + item_enumerated shift 39 /* because item_enumerated==list_enumerated */ + definition shift 38 /* because definition==definition_block */ State 1: (0) doc ::= blocks * @@ -131,11 +140,13 @@ State 1: block ::= * fenced_block block ::= * meta_block block ::= * LINE_TOC + block ::= * definition_block para ::= * LINE_PLAIN para_lines para ::= * LINE_PLAIN indented_code ::= * indented_code code_line - indented_code ::= * LINE_INDENTED_TAB - indented_code ::= * LINE_INDENTED_SPACE + indented_code ::= * indented_line + indented_line ::= * LINE_INDENTED_TAB + indented_line ::= * LINE_INDENTED_SPACE empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY blockquote ::= * LINE_BLOCKQUOTE quote_lines @@ -172,11 +183,15 @@ State 1: fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines meta_block ::= * LINE_META meta_lines meta_block ::= * LINE_META + definition_block ::= * definition_block empty definition + definition_block ::= * definition_block empty + definition_block ::= * definition + definition ::= * para defs $ reduce 0 doc ::= blocks - LINE_PLAIN shift 21 - LINE_INDENTED_TAB shift-reduce 63 indented_code ::= LINE_INDENTED_TAB - LINE_INDENTED_SPACE shift-reduce 64 indented_code ::= LINE_INDENTED_SPACE + LINE_PLAIN shift 23 + LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE LINE_HTML shift 14 LINE_ATX_1 shift-reduce 5 block ::= LINE_ATX_1 LINE_ATX_2 shift-reduce 6 block ::= LINE_ATX_2 @@ -188,31 +203,34 @@ State 1: LINE_BLOCKQUOTE shift 15 LINE_LIST_BULLETED shift 5 LINE_LIST_ENUMERATED shift 4 - LINE_TABLE shift-reduce 78 table ::= LINE_TABLE + LINE_TABLE shift-reduce 85 table ::= LINE_TABLE LINE_DEF_CITATION shift 3 LINE_DEF_FOOTNOTE shift 2 - LINE_DEF_LINK shift 16 + LINE_DEF_LINK shift 17 LINE_FENCE_BACKTICK shift 13 LINE_FENCE_BACKTICK_START shift 12 LINE_TOC shift-reduce 23 block ::= LINE_TOC - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY LINE_META shift 11 block shift-reduce 1 blocks ::= blocks block - para shift-reduce 3 block ::= para + para shift 29 indented_code shift 10 - empty shift 39 - list_bulleted shift 37 - list_enumerated shift 35 + empty shift 45 + list_bulleted shift 41 + list_enumerated shift 39 blockquote shift-reduce 14 block ::= blockquote - table shift 38 + table shift 44 def_citation shift-reduce 17 block ::= def_citation def_footnote shift-reduce 18 block ::= def_footnote def_link shift-reduce 19 block ::= def_link html_block shift-reduce 20 block ::= html_block fenced_block shift-reduce 21 block ::= fenced_block meta_block shift-reduce 22 block ::= meta_block - item_bulleted shift 37 /* because item_bulleted==list_bulleted */ - item_enumerated shift 35 /* because item_enumerated==list_enumerated */ + definition_block shift 38 + indented_line shift 10 /* because indented_line==indented_code */ + item_bulleted shift 41 /* because item_bulleted==list_bulleted */ + item_enumerated shift 39 /* because item_enumerated==list_enumerated */ + definition shift 38 /* because definition==definition_block */ State 2: para_lines ::= * para_lines para_line @@ -228,17 +246,17 @@ State 2: def_footnote ::= LINE_DEF_FOOTNOTE * para_lines cont_blocks def_footnote ::= LINE_DEF_FOOTNOTE * para_lines def_footnote ::= LINE_DEF_FOOTNOTE * cont_blocks - (80) def_footnote ::= LINE_DEF_FOOTNOTE * + (87) def_footnote ::= LINE_DEF_FOOTNOTE * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 80 ** Parsing conflict ** - empty shift 29 + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 87 ** Parsing conflict ** + empty shift 32 para_lines shift 6 para_line shift 6 /* because para_line==para_lines */ - cont_blocks shift 17 - cont_block shift 17 /* because cont_block==cont_blocks */ - {default} reduce 80 def_footnote ::= LINE_DEF_FOOTNOTE + cont_blocks shift 18 + cont_block shift 18 /* because cont_block==cont_blocks */ + {default} reduce 87 def_footnote ::= LINE_DEF_FOOTNOTE State 3: para_lines ::= * para_lines para_line @@ -254,17 +272,17 @@ State 3: def_citation ::= LINE_DEF_CITATION * para_lines cont_blocks def_citation ::= LINE_DEF_CITATION * para_lines def_citation ::= LINE_DEF_CITATION * cont_blocks - (79) def_citation ::= LINE_DEF_CITATION * + (86) def_citation ::= LINE_DEF_CITATION * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 79 ** Parsing conflict ** - empty shift 29 + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 86 ** Parsing conflict ** + empty shift 32 para_lines shift 7 para_line shift 7 /* because para_line==para_lines */ - cont_blocks shift 19 - cont_block shift 19 /* because cont_block==cont_blocks */ - {default} reduce 79 def_citation ::= LINE_DEF_CITATION + cont_blocks shift 20 + cont_block shift 20 /* because cont_block==cont_blocks */ + {default} reduce 86 def_citation ::= LINE_DEF_CITATION State 4: para_lines ::= * para_lines para_line @@ -275,22 +293,22 @@ State 4: item_enumerated ::= LINE_LIST_ENUMERATED * para_lines cont_blocks item_enumerated ::= LINE_LIST_ENUMERATED * para_lines item_enumerated ::= LINE_LIST_ENUMERATED * cont_blocks - (39) item_enumerated ::= LINE_LIST_ENUMERATED * + (40) item_enumerated ::= LINE_LIST_ENUMERATED * cont_blocks ::= * cont_blocks cont_block cont_blocks ::= * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 39 ** Parsing conflict ** - empty shift 29 + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 40 ** Parsing conflict ** + empty shift 32 para_lines shift 8 para_line shift 8 /* because para_line==para_lines */ - cont_blocks shift 22 - cont_block shift 22 /* because cont_block==cont_blocks */ - {default} reduce 39 item_enumerated ::= LINE_LIST_ENUMERATED + cont_blocks shift 24 + cont_block shift 24 /* because cont_block==cont_blocks */ + {default} reduce 40 item_enumerated ::= LINE_LIST_ENUMERATED State 5: para_lines ::= * para_lines para_line @@ -301,22 +319,22 @@ State 5: item_bulleted ::= LINE_LIST_BULLETED * para_lines cont_blocks item_bulleted ::= LINE_LIST_BULLETED * para_lines item_bulleted ::= LINE_LIST_BULLETED * cont_blocks - (34) item_bulleted ::= LINE_LIST_BULLETED * + (35) item_bulleted ::= LINE_LIST_BULLETED * cont_blocks ::= * cont_blocks cont_block cont_blocks ::= * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 34 ** Parsing conflict ** - empty shift 29 + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 35 ** Parsing conflict ** + empty shift 32 para_lines shift 9 para_line shift 9 /* because para_line==para_lines */ - cont_blocks shift 24 - cont_block shift 24 /* because cont_block==cont_blocks */ - {default} reduce 34 item_bulleted ::= LINE_LIST_BULLETED + cont_blocks shift 26 + cont_block shift 26 /* because cont_block==cont_blocks */ + {default} reduce 35 item_bulleted ::= LINE_LIST_BULLETED State 6: para_lines ::= para_lines * para_line @@ -329,16 +347,16 @@ State 6: cont_block ::= * empty indented_line cont_block ::= * empty def_footnote ::= LINE_DEF_FOOTNOTE para_lines * cont_blocks - (48) def_footnote ::= LINE_DEF_FOOTNOTE para_lines * + (49) def_footnote ::= LINE_DEF_FOOTNOTE para_lines * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 48 ** Parsing conflict ** - empty shift 29 - para_line shift-reduce 25 para_lines ::= para_lines para_line - cont_blocks shift 18 - cont_block shift 18 /* because cont_block==cont_blocks */ - {default} reduce 48 def_footnote ::= LINE_DEF_FOOTNOTE para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 49 ** Parsing conflict ** + empty shift 32 + para_line shift-reduce 26 para_lines ::= para_lines para_line + cont_blocks shift 19 + cont_block shift 19 /* because cont_block==cont_blocks */ + {default} reduce 49 def_footnote ::= LINE_DEF_FOOTNOTE para_lines State 7: para_lines ::= para_lines * para_line @@ -351,16 +369,16 @@ State 7: cont_block ::= * empty indented_line cont_block ::= * empty def_citation ::= LINE_DEF_CITATION para_lines * cont_blocks - (45) def_citation ::= LINE_DEF_CITATION para_lines * + (46) def_citation ::= LINE_DEF_CITATION para_lines * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 45 ** Parsing conflict ** - empty shift 29 - para_line shift-reduce 25 para_lines ::= para_lines para_line - cont_blocks shift 20 - cont_block shift 20 /* because cont_block==cont_blocks */ - {default} reduce 45 def_citation ::= LINE_DEF_CITATION para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 46 ** Parsing conflict ** + empty shift 32 + para_line shift-reduce 26 para_lines ::= para_lines para_line + cont_blocks shift 21 + cont_block shift 21 /* because cont_block==cont_blocks */ + {default} reduce 46 def_citation ::= LINE_DEF_CITATION para_lines State 8: para_lines ::= para_lines * para_line @@ -368,21 +386,21 @@ State 8: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY item_enumerated ::= LINE_LIST_ENUMERATED para_lines * cont_blocks - (37) item_enumerated ::= LINE_LIST_ENUMERATED para_lines * + (38) item_enumerated ::= LINE_LIST_ENUMERATED para_lines * cont_blocks ::= * cont_blocks cont_block cont_blocks ::= * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 37 ** Parsing conflict ** - empty shift 29 - para_line shift-reduce 25 para_lines ::= para_lines para_line - cont_blocks shift 23 - cont_block shift 23 /* because cont_block==cont_blocks */ - {default} reduce 37 item_enumerated ::= LINE_LIST_ENUMERATED para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 38 ** Parsing conflict ** + empty shift 32 + para_line shift-reduce 26 para_lines ::= para_lines para_line + cont_blocks shift 25 + cont_block shift 25 /* because cont_block==cont_blocks */ + {default} reduce 38 item_enumerated ::= LINE_LIST_ENUMERATED para_lines State 9: para_lines ::= para_lines * para_line @@ -390,21 +408,21 @@ State 9: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY item_bulleted ::= LINE_LIST_BULLETED para_lines * cont_blocks - (32) item_bulleted ::= LINE_LIST_BULLETED para_lines * + (33) item_bulleted ::= LINE_LIST_BULLETED para_lines * cont_blocks ::= * cont_blocks cont_block cont_blocks ::= * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 32 ** Parsing conflict ** - empty shift 29 - para_line shift-reduce 25 para_lines ::= para_lines para_line - cont_blocks shift 25 - cont_block shift 25 /* because cont_block==cont_blocks */ - {default} reduce 32 item_bulleted ::= LINE_LIST_BULLETED para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 33 ** Parsing conflict ** + empty shift 32 + para_line shift-reduce 26 para_lines ::= para_lines para_line + cont_blocks shift 27 + cont_block shift 27 /* because cont_block==cont_blocks */ + {default} reduce 33 item_bulleted ::= LINE_LIST_BULLETED para_lines State 10: (4) block ::= indented_code * @@ -414,30 +432,30 @@ State 10: indented_line ::= * LINE_INDENTED_TAB indented_line ::= * LINE_INDENTED_SPACE - LINE_INDENTED_TAB shift-reduce 67 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB LINE_INDENTED_TAB reduce 4 ** Parsing conflict ** - LINE_INDENTED_SPACE shift-reduce 68 indented_line ::= LINE_INDENTED_SPACE + LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE LINE_INDENTED_SPACE reduce 4 ** Parsing conflict ** - LINE_EMPTY shift-reduce 66 code_line ::= LINE_EMPTY + LINE_EMPTY shift-reduce 73 code_line ::= LINE_EMPTY LINE_EMPTY reduce 4 ** Parsing conflict ** - code_line shift-reduce 26 indented_code ::= indented_code code_line - indented_line shift-reduce 26 indented_code ::= indented_code code_line /* because indented_line==code_line */ + code_line shift-reduce 27 indented_code ::= indented_code code_line + indented_line shift-reduce 27 indented_code ::= indented_code code_line /* because indented_line==code_line */ {default} reduce 4 block ::= indented_code State 11: meta_block ::= LINE_META * meta_lines - (89) meta_block ::= LINE_META * + (96) meta_block ::= LINE_META * meta_lines ::= * meta_lines meta_line meta_lines ::= * meta_line meta_line ::= * LINE_META meta_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 92 meta_line ::= LINE_CONTINUATION - LINE_META shift-reduce 91 meta_line ::= LINE_META - LINE_META reduce 89 ** Parsing conflict ** - meta_lines shift 30 - meta_line shift 30 /* because meta_line==meta_lines */ - {default} reduce 89 meta_block ::= LINE_META + LINE_CONTINUATION shift-reduce 99 meta_line ::= LINE_CONTINUATION + LINE_META shift-reduce 98 meta_line ::= LINE_META + LINE_META reduce 96 ** Parsing conflict ** + meta_lines shift 33 + meta_line shift 33 /* because meta_line==meta_lines */ + {default} reduce 96 meta_block ::= LINE_META State 12: fenced_block ::= LINE_FENCE_BACKTICK_START * fenced_lines LINE_FENCE_BACKTICK @@ -447,10 +465,10 @@ State 12: fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 87 fenced_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 88 fenced_line ::= LINE_EMPTY - fenced_lines shift 27 - fenced_line shift 27 /* because fenced_line==fenced_lines */ + LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY + fenced_lines shift 30 + fenced_line shift 30 /* because fenced_line==fenced_lines */ State 13: fenced_block ::= LINE_FENCE_BACKTICK * fenced_lines LINE_FENCE_BACKTICK @@ -460,299 +478,351 @@ State 13: fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 87 fenced_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 88 fenced_line ::= LINE_EMPTY - fenced_lines shift 28 - fenced_line shift 28 /* because fenced_line==fenced_lines */ + LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY + fenced_lines shift 31 + fenced_line shift 31 /* because fenced_line==fenced_lines */ State 14: html_block ::= LINE_HTML * html_block_lines - (82) html_block ::= LINE_HTML * + (89) html_block ::= LINE_HTML * html_block_lines ::= * html_block_lines html_block_line html_block_lines ::= * html_block_line html_block_line ::= * LINE_CONTINUATION html_block_line ::= * LINE_HTML - LINE_CONTINUATION shift-reduce 84 html_block_line ::= LINE_CONTINUATION - LINE_HTML shift-reduce 85 html_block_line ::= LINE_HTML - LINE_HTML reduce 82 ** Parsing conflict ** - html_block_lines shift 31 - html_block_line shift 31 /* because html_block_line==html_block_lines */ - {default} reduce 82 html_block ::= LINE_HTML + LINE_CONTINUATION shift-reduce 91 html_block_line ::= LINE_CONTINUATION + LINE_HTML shift-reduce 92 html_block_line ::= LINE_HTML + LINE_HTML reduce 89 ** Parsing conflict ** + html_block_lines shift 34 + html_block_line shift 34 /* because html_block_line==html_block_lines */ + {default} reduce 89 html_block ::= LINE_HTML State 15: blockquote ::= LINE_BLOCKQUOTE * quote_lines - (70) blockquote ::= LINE_BLOCKQUOTE * + (77) blockquote ::= LINE_BLOCKQUOTE * quote_lines ::= * quote_lines quote_line quote_lines ::= * quote_line quote_line ::= * LINE_BLOCKQUOTE quote_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 73 quote_line ::= LINE_CONTINUATION - LINE_BLOCKQUOTE shift-reduce 72 quote_line ::= LINE_BLOCKQUOTE - LINE_BLOCKQUOTE reduce 70 ** Parsing conflict ** - quote_lines shift 32 - quote_line shift 32 /* because quote_line==quote_lines */ - {default} reduce 70 blockquote ::= LINE_BLOCKQUOTE + LINE_CONTINUATION shift-reduce 80 quote_line ::= LINE_CONTINUATION + LINE_BLOCKQUOTE shift-reduce 79 quote_line ::= LINE_BLOCKQUOTE + LINE_BLOCKQUOTE reduce 77 ** Parsing conflict ** + quote_lines shift 35 + quote_line shift 35 /* because quote_line==quote_lines */ + {default} reduce 77 blockquote ::= LINE_BLOCKQUOTE State 16: + para ::= * LINE_PLAIN para_lines + para ::= * LINE_PLAIN + empty ::= empty * LINE_EMPTY + definition_block ::= definition_block empty * definition + (62) definition_block ::= definition_block empty * + definition ::= * para defs + + LINE_PLAIN shift 23 + LINE_PLAIN reduce 62 ** Parsing conflict ** + LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY + LINE_EMPTY reduce 62 ** Parsing conflict ** + para shift 22 + definition shift-reduce 61 definition_block ::= definition_block empty definition + {default} reduce 62 definition_block ::= definition_block empty + +State 17: para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION def_link ::= LINE_DEF_LINK * para_lines - (81) def_link ::= LINE_DEF_LINK * + (88) def_link ::= LINE_DEF_LINK * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_lines shift 33 - para_line shift 33 /* because para_line==para_lines */ - {default} reduce 81 def_link ::= LINE_DEF_LINK + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_lines shift 36 + para_line shift 36 /* because para_line==para_lines */ + {default} reduce 88 def_link ::= LINE_DEF_LINK -State 17: +State 18: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - (49) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks * + (50) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks * - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 49 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 49 def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 50 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 50 def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks -State 18: +State 19: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - (47) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks * + (48) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks * - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 47 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 47 def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 48 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 48 def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks -State 19: +State 20: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - (46) def_citation ::= LINE_DEF_CITATION cont_blocks * + (47) def_citation ::= LINE_DEF_CITATION cont_blocks * - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 46 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 46 def_citation ::= LINE_DEF_CITATION cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 47 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 47 def_citation ::= LINE_DEF_CITATION cont_blocks -State 20: +State 21: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - (44) def_citation ::= LINE_DEF_CITATION para_lines cont_blocks * + (45) def_citation ::= LINE_DEF_CITATION para_lines cont_blocks * - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 44 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 44 def_citation ::= LINE_DEF_CITATION para_lines cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 45 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 45 def_citation ::= LINE_DEF_CITATION para_lines cont_blocks -State 21: +State 22: + definition ::= para * defs + defs ::= * defs def + defs ::= * def + def ::= * LINE_DEFINITION def_lines + def ::= * LINE_DEFINITION + + LINE_DEFINITION shift 42 + defs shift 43 + def shift 43 /* because def==defs */ + +State 23: para ::= LINE_PLAIN * para_lines - (60) para ::= LINE_PLAIN * + (68) para ::= LINE_PLAIN * para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_lines shift 34 - para_line shift 34 /* because para_line==para_lines */ - {default} reduce 60 para ::= LINE_PLAIN + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_lines shift 37 + para_line shift 37 /* because para_line==para_lines */ + {default} reduce 68 para ::= LINE_PLAIN -State 22: +State 24: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY - (38) item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks * + (39) item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks * cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 38 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 38 item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 39 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 39 item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks -State 23: +State 25: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY - (36) item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks * + (37) item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks * cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 36 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 36 item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 37 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 37 item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks -State 24: +State 26: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY - (33) item_bulleted ::= LINE_LIST_BULLETED cont_blocks * + (34) item_bulleted ::= LINE_LIST_BULLETED cont_blocks * cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 33 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 33 item_bulleted ::= LINE_LIST_BULLETED cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 34 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 34 item_bulleted ::= LINE_LIST_BULLETED cont_blocks -State 25: +State 27: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY - (31) item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks * + (32) item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks * cont_blocks ::= cont_blocks * cont_block cont_block ::= * empty indented_line para_lines cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 69 empty ::= LINE_EMPTY - LINE_EMPTY reduce 31 ** Parsing conflict ** - empty shift 29 - cont_block shift-reduce 40 cont_blocks ::= cont_blocks cont_block - {default} reduce 31 item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 32 ** Parsing conflict ** + empty shift 32 + cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block + {default} reduce 32 item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks -State 26: +State 28: para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION cont_block ::= empty indented_line * para_lines - (42) cont_block ::= empty indented_line * + (43) cont_block ::= empty indented_line * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_lines shift 36 - para_line shift 36 /* because para_line==para_lines */ - {default} reduce 42 cont_block ::= empty indented_line + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_lines shift 40 + para_line shift 40 /* because para_line==para_lines */ + {default} reduce 43 cont_block ::= empty indented_line -State 27: +State 29: + (3) block ::= para * + definition ::= para * defs + defs ::= * defs def + defs ::= * def + def ::= * LINE_DEFINITION def_lines + def ::= * LINE_DEFINITION + + LINE_DEFINITION shift 42 + defs shift 43 + def shift 43 /* because def==defs */ + {default} reduce 3 block ::= para + +State 30: fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * LINE_FENCE_BACKTICK - (56) fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * + (57) fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * fenced_lines ::= fenced_lines * fenced_line fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 87 fenced_line ::= LINE_CONTINUATION - LINE_FENCE_BACKTICK shift-reduce 55 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK - LINE_FENCE_BACKTICK reduce 56 ** Parsing conflict ** - LINE_EMPTY shift-reduce 88 fenced_line ::= LINE_EMPTY - LINE_EMPTY reduce 56 ** Parsing conflict ** - fenced_line shift-reduce 57 fenced_lines ::= fenced_lines fenced_line - {default} reduce 56 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines + LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION + LINE_FENCE_BACKTICK shift-reduce 56 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK + LINE_FENCE_BACKTICK reduce 57 ** Parsing conflict ** + LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY + LINE_EMPTY reduce 57 ** Parsing conflict ** + fenced_line shift-reduce 58 fenced_lines ::= fenced_lines fenced_line + {default} reduce 57 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines -State 28: +State 31: fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * LINE_FENCE_BACKTICK - (54) fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * + (55) fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * fenced_lines ::= fenced_lines * fenced_line fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 87 fenced_line ::= LINE_CONTINUATION - LINE_FENCE_BACKTICK shift-reduce 53 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK - LINE_FENCE_BACKTICK reduce 54 ** Parsing conflict ** - LINE_EMPTY shift-reduce 88 fenced_line ::= LINE_EMPTY - LINE_EMPTY reduce 54 ** Parsing conflict ** - fenced_line shift-reduce 57 fenced_lines ::= fenced_lines fenced_line - {default} reduce 54 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines + LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION + LINE_FENCE_BACKTICK shift-reduce 54 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK + LINE_FENCE_BACKTICK reduce 55 ** Parsing conflict ** + LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY + LINE_EMPTY reduce 55 ** Parsing conflict ** + fenced_line shift-reduce 58 fenced_lines ::= fenced_lines fenced_line + {default} reduce 55 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines -State 29: +State 32: indented_line ::= * LINE_INDENTED_TAB indented_line ::= * LINE_INDENTED_SPACE empty ::= empty * LINE_EMPTY cont_block ::= empty * indented_line para_lines cont_block ::= empty * indented_line - (77) cont_block ::= empty * + (84) cont_block ::= empty * - LINE_INDENTED_TAB shift-reduce 67 indented_line ::= LINE_INDENTED_TAB - LINE_INDENTED_TAB reduce 77 ** Parsing conflict ** - LINE_INDENTED_SPACE shift-reduce 68 indented_line ::= LINE_INDENTED_SPACE - LINE_INDENTED_SPACE reduce 77 ** Parsing conflict ** - LINE_EMPTY shift-reduce 27 empty ::= empty LINE_EMPTY - LINE_EMPTY reduce 77 ** Parsing conflict ** - indented_line shift 26 - {default} reduce 77 cont_block ::= empty + LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_TAB reduce 84 ** Parsing conflict ** + LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE + LINE_INDENTED_SPACE reduce 84 ** Parsing conflict ** + LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY + LINE_EMPTY reduce 84 ** Parsing conflict ** + indented_line shift 28 + {default} reduce 84 cont_block ::= empty -State 30: - (58) meta_block ::= LINE_META meta_lines * +State 33: + (59) meta_block ::= LINE_META meta_lines * meta_lines ::= meta_lines * meta_line meta_line ::= * LINE_META meta_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 92 meta_line ::= LINE_CONTINUATION - LINE_META shift-reduce 91 meta_line ::= LINE_META - LINE_META reduce 58 ** Parsing conflict ** - meta_line shift-reduce 59 meta_lines ::= meta_lines meta_line - {default} reduce 58 meta_block ::= LINE_META meta_lines + LINE_CONTINUATION shift-reduce 99 meta_line ::= LINE_CONTINUATION + LINE_META shift-reduce 98 meta_line ::= LINE_META + LINE_META reduce 59 ** Parsing conflict ** + meta_line shift-reduce 60 meta_lines ::= meta_lines meta_line + {default} reduce 59 meta_block ::= LINE_META meta_lines -State 31: - (51) html_block ::= LINE_HTML html_block_lines * +State 34: + (52) html_block ::= LINE_HTML html_block_lines * html_block_lines ::= html_block_lines * html_block_line html_block_line ::= * LINE_CONTINUATION html_block_line ::= * LINE_HTML - LINE_CONTINUATION shift-reduce 84 html_block_line ::= LINE_CONTINUATION - LINE_HTML shift-reduce 85 html_block_line ::= LINE_HTML - LINE_HTML reduce 51 ** Parsing conflict ** - html_block_line shift-reduce 52 html_block_lines ::= html_block_lines html_block_line - {default} reduce 51 html_block ::= LINE_HTML html_block_lines + LINE_CONTINUATION shift-reduce 91 html_block_line ::= LINE_CONTINUATION + LINE_HTML shift-reduce 92 html_block_line ::= LINE_HTML + LINE_HTML reduce 52 ** Parsing conflict ** + html_block_line shift-reduce 53 html_block_lines ::= html_block_lines html_block_line + {default} reduce 52 html_block ::= LINE_HTML html_block_lines -State 32: - (28) blockquote ::= LINE_BLOCKQUOTE quote_lines * +State 35: + (29) blockquote ::= LINE_BLOCKQUOTE quote_lines * quote_lines ::= quote_lines * quote_line quote_line ::= * LINE_BLOCKQUOTE quote_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 73 quote_line ::= LINE_CONTINUATION - LINE_BLOCKQUOTE shift-reduce 72 quote_line ::= LINE_BLOCKQUOTE - LINE_BLOCKQUOTE reduce 28 ** Parsing conflict ** - quote_line shift-reduce 29 quote_lines ::= quote_lines quote_line - {default} reduce 28 blockquote ::= LINE_BLOCKQUOTE quote_lines + LINE_CONTINUATION shift-reduce 80 quote_line ::= LINE_CONTINUATION + LINE_BLOCKQUOTE shift-reduce 79 quote_line ::= LINE_BLOCKQUOTE + LINE_BLOCKQUOTE reduce 29 ** Parsing conflict ** + quote_line shift-reduce 30 quote_lines ::= quote_lines quote_line + {default} reduce 29 blockquote ::= LINE_BLOCKQUOTE quote_lines -State 33: +State 36: para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION - (50) def_link ::= LINE_DEF_LINK para_lines * + (51) def_link ::= LINE_DEF_LINK para_lines * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_line shift-reduce 25 para_lines ::= para_lines para_line - {default} reduce 50 def_link ::= LINE_DEF_LINK para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_line shift-reduce 26 para_lines ::= para_lines para_line + {default} reduce 51 def_link ::= LINE_DEF_LINK para_lines -State 34: - (24) para ::= LINE_PLAIN para_lines * +State 37: + (25) para ::= LINE_PLAIN para_lines * para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_line shift-reduce 25 para_lines ::= para_lines para_line - {default} reduce 24 para ::= LINE_PLAIN para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_line shift-reduce 26 para_lines ::= para_lines para_line + {default} reduce 25 para ::= LINE_PLAIN para_lines -State 35: +State 38: + (24) block ::= definition_block * + empty ::= * empty LINE_EMPTY + empty ::= * LINE_EMPTY + definition_block ::= definition_block * empty definition + definition_block ::= definition_block * empty + + LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY reduce 24 ** Parsing conflict ** + empty shift 16 + {default} reduce 24 block ::= definition_block + +State 39: (13) block ::= list_enumerated * list_enumerated ::= list_enumerated * item_enumerated item_enumerated ::= * LINE_LIST_ENUMERATED para_lines cont_blocks @@ -762,19 +832,19 @@ State 35: LINE_LIST_ENUMERATED shift 4 LINE_LIST_ENUMERATED reduce 13 ** Parsing conflict ** - item_enumerated shift-reduce 35 list_enumerated ::= list_enumerated item_enumerated + item_enumerated shift-reduce 36 list_enumerated ::= list_enumerated item_enumerated {default} reduce 13 block ::= list_enumerated -State 36: +State 40: para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION - (41) cont_block ::= empty indented_line para_lines * + (42) cont_block ::= empty indented_line para_lines * - LINE_CONTINUATION shift-reduce 62 para_line ::= LINE_CONTINUATION - para_line shift-reduce 25 para_lines ::= para_lines para_line - {default} reduce 41 cont_block ::= empty indented_line para_lines + LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + para_line shift-reduce 26 para_lines ::= para_lines para_line + {default} reduce 42 cont_block ::= empty indented_line para_lines -State 37: +State 41: (12) block ::= list_bulleted * list_bulleted ::= list_bulleted * item_bulleted item_bulleted ::= * LINE_LIST_BULLETED para_lines cont_blocks @@ -784,25 +854,52 @@ State 37: LINE_LIST_BULLETED shift 5 LINE_LIST_BULLETED reduce 12 ** Parsing conflict ** - item_bulleted shift-reduce 30 list_bulleted ::= list_bulleted item_bulleted + item_bulleted shift-reduce 31 list_bulleted ::= list_bulleted item_bulleted {default} reduce 12 block ::= list_bulleted -State 38: +State 42: + def ::= LINE_DEFINITION * def_lines + (66) def ::= LINE_DEFINITION * + def_lines ::= * def_lines LINE_CONTINUATION + def_lines ::= * LINE_CONTINUATION + + LINE_CONTINUATION shift-reduce 102 def_lines ::= LINE_CONTINUATION + def_lines shift 46 + {default} reduce 66 def ::= LINE_DEFINITION + +State 43: + (63) definition ::= para defs * + defs ::= defs * def + def ::= * LINE_DEFINITION def_lines + def ::= * LINE_DEFINITION + + LINE_DEFINITION shift 42 + def shift-reduce 64 defs ::= defs def + {default} reduce 63 definition ::= para defs + +State 44: (15) block ::= table * table ::= table * LINE_TABLE - LINE_TABLE shift-reduce 43 table ::= table LINE_TABLE + LINE_TABLE shift-reduce 44 table ::= table LINE_TABLE LINE_TABLE reduce 15 ** Parsing conflict ** {default} reduce 15 block ::= table -State 39: +State 45: (11) block ::= empty * empty ::= empty * LINE_EMPTY - LINE_EMPTY shift-reduce 27 empty ::= empty LINE_EMPTY + LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY LINE_EMPTY reduce 11 ** Parsing conflict ** {default} reduce 11 block ::= empty +State 46: + (65) def ::= LINE_DEFINITION def_lines * + def_lines ::= def_lines * LINE_CONTINUATION + + LINE_CONTINUATION shift-reduce 67 def_lines ::= def_lines LINE_CONTINUATION + {default} reduce 65 def ::= LINE_DEFINITION def_lines + ---------------------------------------------------- Symbols: 0: $: @@ -830,36 +927,42 @@ Symbols: 22: LINE_TOC 23: LINE_EMPTY 24: LINE_META - 25: error: - 26: doc: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META - 27: blocks: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META - 28: block: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META - 29: para: LINE_PLAIN - 30: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE - 31: empty: LINE_EMPTY - 32: list_bulleted: LINE_LIST_BULLETED - 33: list_enumerated: LINE_LIST_ENUMERATED - 34: blockquote: LINE_BLOCKQUOTE - 35: table: LINE_TABLE - 36: def_citation: LINE_DEF_CITATION - 37: def_footnote: LINE_DEF_FOOTNOTE - 38: def_link: LINE_DEF_LINK - 39: html_block: LINE_HTML - 40: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START - 41: meta_block: LINE_META - 42: para_lines: LINE_CONTINUATION - 43: para_line: LINE_CONTINUATION - 44: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY - 45: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE - 46: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE - 47: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE - 48: item_bulleted: LINE_LIST_BULLETED - 49: cont_blocks: LINE_EMPTY - 50: item_enumerated: LINE_LIST_ENUMERATED - 51: cont_block: LINE_EMPTY - 52: html_block_lines: LINE_CONTINUATION LINE_HTML - 53: html_block_line: LINE_CONTINUATION LINE_HTML - 54: fenced_lines: LINE_CONTINUATION LINE_EMPTY - 55: fenced_line: LINE_CONTINUATION LINE_EMPTY - 56: meta_lines: LINE_CONTINUATION LINE_META - 57: meta_line: LINE_CONTINUATION LINE_META + 25: LINE_DEFINITION + 26: error: + 27: doc: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META + 28: blocks: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META + 29: block: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_TOC LINE_EMPTY LINE_META + 30: para: LINE_PLAIN + 31: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE + 32: empty: LINE_EMPTY + 33: list_bulleted: LINE_LIST_BULLETED + 34: list_enumerated: LINE_LIST_ENUMERATED + 35: blockquote: LINE_BLOCKQUOTE + 36: table: LINE_TABLE + 37: def_citation: LINE_DEF_CITATION + 38: def_footnote: LINE_DEF_FOOTNOTE + 39: def_link: LINE_DEF_LINK + 40: html_block: LINE_HTML + 41: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START + 42: meta_block: LINE_META + 43: definition_block: LINE_PLAIN + 44: para_lines: LINE_CONTINUATION + 45: para_line: LINE_CONTINUATION + 46: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY + 47: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE + 48: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE + 49: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE + 50: item_bulleted: LINE_LIST_BULLETED + 51: cont_blocks: LINE_EMPTY + 52: item_enumerated: LINE_LIST_ENUMERATED + 53: cont_block: LINE_EMPTY + 54: html_block_lines: LINE_CONTINUATION LINE_HTML + 55: html_block_line: LINE_CONTINUATION LINE_HTML + 56: fenced_lines: LINE_CONTINUATION LINE_EMPTY + 57: fenced_line: LINE_CONTINUATION LINE_EMPTY + 58: meta_lines: LINE_CONTINUATION LINE_META + 59: meta_line: LINE_CONTINUATION LINE_META + 60: definition: LINE_PLAIN + 61: defs: LINE_DEFINITION + 62: def: LINE_DEFINITION + 63: def_lines: LINE_CONTINUATION diff --git a/src/parser.y b/src/parser.y index 61e7c23..d53ab98 100644 --- a/src/parser.y +++ b/src/parser.y @@ -109,6 +109,7 @@ block(A) ::= html_block(B). { A = token_new_parent(B, BLOCK_HTML); } block(A) ::= fenced_block(B). { A = token_new_parent(B, BLOCK_CODE_FENCED); B->child->type = CODE_FENCE; } block(A) ::= meta_block(B). { A = token_new_parent(B, BLOCK_META); } block(A) ::= LINE_TOC(B). { A = token_new_parent(B, BLOCK_TOC); } +block(A) ::= definition_block(B). { A = token_new_parent(B, BLOCK_DEFLIST); } para(A) ::= LINE_PLAIN(B) para_lines(C). { A = B; token_chain_append(B, C); } para ::= LINE_PLAIN. @@ -119,8 +120,7 @@ para_lines ::= para_line. para_line ::= LINE_CONTINUATION. indented_code(A) ::= indented_code(B) code_line(C). { A = B; token_chain_append(B, C); } -indented_code ::= LINE_INDENTED_TAB. -indented_code ::= LINE_INDENTED_SPACE. +indented_code ::= indented_line. code_line ::= indented_line. code_line ::= LINE_EMPTY. @@ -211,6 +211,20 @@ meta_lines ::= meta_line. meta_line ::= LINE_META. meta_line ::= LINE_CONTINUATION. +definition_block(A) ::= definition_block(B) empty(C) definition(D). { A = B; token_chain_append(B, C); token_chain_append(B, D); } +definition_block(A) ::= definition_block(B) empty(C). { A = B; token_chain_append(B, C); } +definition_block ::= definition. + +definition(A) ::= para(B) defs(C). { A = token_new_parent(B, BLOCK_DEFINITION_GROUP); token_chain_append(B, C); B->type = BLOCK_TERM; } + +defs(A) ::= defs(B) def(C). { A = B; token_chain_append(B, C); } +defs ::= def. + +def(A) ::= LINE_DEFINITION(B) def_lines(C). { A = token_new_parent(B, BLOCK_DEFINITION); token_chain_append(B, C); } +def(A) ::= LINE_DEFINITION(B). { A = token_new_parent(B, BLOCK_DEFINITION); } + +def_lines(A) ::= def_lines(B) LINE_CONTINUATION(C). { A = B; token_chain_append(B, C); } +def_lines ::= LINE_CONTINUATION. // diff --git a/src/scanners.c b/src/scanners.c index 221ec4b..e8e2d78 100644 --- a/src/scanners.c +++ b/src/scanners.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 on Sat Jan 28 15:02:52 2017 */ +/* Generated by re2c 0.14.3 on Sat Feb 4 08:26:54 2017 */ /** MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more. @@ -8961,6 +8961,86 @@ yy641: } +size_t scan_definition(const char * c) { + const char * marker = NULL; + const char * start = c; + + +{ + char yych; + yych = *c; + switch (yych) { + case '\n': goto yy644; + case ' ': goto yy645; + case ':': goto yy646; + default: goto yy647; + } +yy644: + { return 0; } +yy645: + yych = *(marker = ++c); + switch (yych) { + case ' ': goto yy652; + case ':': goto yy654; + default: goto yy644; + } +yy646: + yych = *++c; + switch (yych) { + case 0x00: + case '\n': + case '\r': goto yy644; + default: goto yy649; + } +yy647: + yych = *++c; + goto yy644; +yy648: + ++c; + yych = *c; +yy649: + switch (yych) { + case 0x00: + case '\n': + case '\r': goto yy650; + case '\t': + case ' ': goto yy648; + default: goto yy651; + } +yy650: + { return (size_t)( c - start ); } +yy651: + yych = *++c; + goto yy650; +yy652: + yych = *++c; + switch (yych) { + case ' ': goto yy655; + case ':': goto yy654; + default: goto yy653; + } +yy653: + c = marker; + goto yy644; +yy654: + yych = *++c; + switch (yych) { + case 0x00: + case '\n': + case '\r': goto yy653; + default: goto yy649; + } +yy655: + ++c; + switch ((yych = *c)) { + case ':': goto yy654; + default: goto yy653; + } +} + +} + + #ifdef TEST void Test_scan_url(CuTest* tc) { int url_len; diff --git a/src/scanners.h b/src/scanners.h index 68110fd..6233483 100644 --- a/src/scanners.h +++ b/src/scanners.h @@ -63,6 +63,7 @@ size_t scan_attr(const char * c); size_t scan_attributes(const char * c); +size_t scan_definition(const char * c); size_t scan_email(const char * c); size_t scan_fence_start(const char * c); size_t scan_fence_end(const char * c); diff --git a/src/scanners.re b/src/scanners.re index 2ae6207..5956de0 100644 --- a/src/scanners.re +++ b/src/scanners.re @@ -136,6 +136,8 @@ meta_value = [^\n\r\x00]+; meta_line = meta_key sp ':' meta_value nl; // meta_line can't match url above + + definition = non_indent ':' sp [^\n\r\x00]; */ @@ -335,6 +337,17 @@ size_t scan_meta_key(const char * c) { } +size_t scan_definition(const char * c) { + const char * marker = NULL; + const char * start = c; + +/*!re2c + definition { return (size_t)( c - start ); } + .? { return 0; } +*/ +} + + #ifdef TEST void Test_scan_url(CuTest* tc) { int url_len; diff --git a/templates/README.md.in b/templates/README.md.in index 52d687f..834e4b1 100644 --- a/templates/README.md.in +++ b/templates/README.md.in @@ -24,6 +24,11 @@ * Metadata/Variables * "pathologic" test cases from CommonMark +* 2017-?? -- v 0.1.2a: + + * "pathologic" test suite -- fix handling of nested brackets, e.g. + `[[[[foo]]]]` to avoid bogging down checking for reference links that + don't exist. ## An Announcement! ## @@ -412,6 +417,7 @@ features have been implemented: * Automatic cross-reference targets * Basic Citation support * CriticMarkup support +* Definition lists * Inline and reference footnotes * Image and Link attributes (attributes can now be used with inline links as well as reference links) @@ -440,7 +446,6 @@ Things yet to be completed: * Multiple blocks inside of reference footnotes * Manually specified labels for headers -* Definition lists * Abbreviations * Glossaries * Tables @@ -452,7 +457,7 @@ Things yet to be completed: MultiMarkdown v6 successfully parses the Markdown [syntax page], except for the Setext header at the top. It passes the 29 test files currently in place. -There are a few ad +There are a few at [syntax page]: https://daringfireball.net/projects/markdown/syntax diff --git a/tests/MMD6Tests/Definition Lists.html b/tests/MMD6Tests/Definition Lists.html new file mode 100644 index 0000000..e5080d2 --- /dev/null +++ b/tests/MMD6Tests/Definition Lists.html @@ -0,0 +1,23 @@ +
+
foo
+
bar
+
*foo bar
+ +
baz bat*
+ +
foo
+
bar
+
foo bar +bar foo
+ +
baz bat
+ +
bat
+
foo
+ +
foo
+
*foo bar +bar foo
+ +
baz* bat
+
diff --git a/tests/MMD6Tests/Definition Lists.htmlc b/tests/MMD6Tests/Definition Lists.htmlc new file mode 100644 index 0000000..9d7589f --- /dev/null +++ b/tests/MMD6Tests/Definition Lists.htmlc @@ -0,0 +1,18 @@ +

foo +bar +: foo bar +: baz bat

+ +

foo +bar +: foo bar +bar foo +: baz bat

+ +

bat +: foo

+ +

foo +: foo bar +bar foo +: baz bat

diff --git a/tests/MMD6Tests/Definition Lists.text b/tests/MMD6Tests/Definition Lists.text new file mode 100644 index 0000000..a4bfe8a --- /dev/null +++ b/tests/MMD6Tests/Definition Lists.text @@ -0,0 +1,18 @@ +foo +bar +: *foo bar +: baz bat* + +foo +bar +: *foo bar + bar foo* +: baz bat + +bat +: *foo* + +foo +: *foo bar + bar foo +: baz* bat