]> granicus.if.org Git - multimarkdown/commitdiff
ADDED: Add support for definition lists
authorFletcher T. Penney <fletcher@fletcherpenney.net>
Sat, 4 Feb 2017 13:48:56 +0000 (08:48 -0500)
committerFletcher T. Penney <fletcher@fletcherpenney.net>
Sat, 4 Feb 2017 13:48:56 +0000 (08:48 -0500)
15 files changed:
README.md
src/html.c
src/libMultiMarkdown.h
src/mmd.c
src/parser.c
src/parser.h
src/parser.out
src/parser.y
src/scanners.c
src/scanners.h
src/scanners.re
templates/README.md.in
tests/MMD6Tests/Definition Lists.html [new file with mode: 0644]
tests/MMD6Tests/Definition Lists.htmlc [new file with mode: 0644]
tests/MMD6Tests/Definition Lists.text [new file with mode: 0644]

index 570910cd35e9c994954e326a254a3696dc3fef7e..6ff4fac9fd774b36b6a46fc581b7595a500f7d14 100644 (file)
--- a/README.md
+++ b/README.md
                * 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
 
index b551a1eefbb8557d4f3a84d670cce131509fc40d..e7ccbfbe4b7cc4e0c9ec4920e865e4f158df5710 100644 (file)
@@ -321,6 +321,26 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t
                        print("</blockquote>");
                        scratch->padded = 0;
                        break;
+               case BLOCK_DEFINITION:
+                       pad(out, 2, scratch);
+                       print("<dd>");
+                       mmd_export_token_tree_html(out, source, t->child, offset, scratch);
+                       print("</dd>");
+                       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("<dl>\n");
+                       scratch->padded = 2;
+
+                       mmd_export_token_tree_html(out, source, t->child, t->start + offset, scratch);
+                       pad(out, 1, scratch);
+                       print("</dl>");
+                       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("</p>");
                        scratch->padded = 0;
                        break;
+               case BLOCK_TERM:
+                       pad(out, 2, scratch);
+                       print("<dt>");
+                       mmd_export_token_tree_html(out, source, t->child, offset, scratch);
+                       print("</dt>\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;
        }
 }
index 53894df088e15a97680764908ad417bad28b952a..571f76c59f48764abbbd22d5575f54928457dd41 100644 (file)
@@ -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,
 
index c7a21c08f33492053e1f365bcb7a9ab4ecbd6a6a..5d0b628659ca0edf93b167925335604b98560c4b 100644 (file)
--- 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;
index c6ec5372a97ba3790ffcdfc09f834fac22313d74..da0aaaeb9cfcc69a395d73fbc40f1e993a926d02 100644 (file)
@@ -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 ************************************************/
   };
index e4493c1bf8ccc6e01e161c89c8540f525c96a534..8fbed60b4bc88f45af8f9c840a31a92435baf6ca 100644 (file)
@@ -22,3 +22,4 @@
 #define LINE_TOC                        22
 #define LINE_EMPTY                      23
 #define LINE_META                       24
+#define LINE_DEFINITION                 25
index 41bccb8eadfa21c8ebf66dd41de80411eaf21b2b..5fcdbc3c17df296d91af0b7599dc656896243e45 100644 (file)
@@ -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
index 61e7c23becff4fa65ac7ee230ba6e9ae9a0cdfc4..d53ab98e9992019fa6c5b0e67cee98c5e08942f2 100644 (file)
@@ -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.
 
 
 //
index 221ec4bf58b49092dc7ff844837a76838f1317d0..e8e2d78cbd7c34d7f4b340632b7f4bc99a1dcf06 100644 (file)
@@ -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;
index 68110fde1ee3ec26462688f22753c5869e9bdb79..6233483d9d0a0561a102aa942d6caf7112680da4 100644 (file)
@@ -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);
index 2ae620790b8c92f85d26265d0b3d8b38fa406a3a..5956de09e0910ec6f39dbe4bc952e1b8e9b2aeef 100644 (file)
        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;
index 52d687f61203e470f47e6bae0b8901335eb428b2..834e4b16abac86f19b7b776d4934a25047f499f9 100644 (file)
                * 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 (file)
index 0000000..e5080d2
--- /dev/null
@@ -0,0 +1,23 @@
+<dl>
+<dt>foo</dt>
+<dt>bar</dt>
+<dd>*foo bar</dd>
+
+<dd>baz bat*</dd>
+
+<dt>foo</dt>
+<dt>bar</dt>
+<dd><em>foo bar
+bar foo</em></dd>
+
+<dd>baz bat</dd>
+
+<dt>bat</dt>
+<dd><em>foo</em></dd>
+
+<dt>foo</dt>
+<dd>*foo bar
+bar foo</dd>
+
+<dd>baz* bat</dd>
+</dl>
diff --git a/tests/MMD6Tests/Definition Lists.htmlc b/tests/MMD6Tests/Definition Lists.htmlc
new file mode 100644 (file)
index 0000000..9d7589f
--- /dev/null
@@ -0,0 +1,18 @@
+<p>foo
+bar
+:      <em>foo bar
+:      baz bat</em></p>
+
+<p>foo
+bar
+:      <em>foo bar
+bar foo</em>
+:      baz bat</p>
+
+<p>bat
+:      <em>foo</em></p>
+
+<p>foo
+:      <em>foo bar
+bar foo
+:      baz</em> bat</p>
diff --git a/tests/MMD6Tests/Definition Lists.text b/tests/MMD6Tests/Definition Lists.text
new file mode 100644 (file)
index 0000000..a4bfe8a
--- /dev/null
@@ -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