HTML/Markdown style grammar for ANTLR4

前端 未结 1 356
太阳男子
太阳男子 2021-01-24 07:30

I want to define a HTML/Markdown like grammar for an document that gets transformed to an AST. I\'m aware, that ANTLR4 is not the best tool for doing Markdown things but I\'m wa

相关标签:
1条回答
  • 2021-01-24 07:49

    The current solution looks like this lexer and grammar rules:

    lexer grammar dnpMDAuslagernLexer;
    
    /*@members {
        public static final int COMMENTS = 1;
    }*/
    
    NL
        : [\r\n]
        ;
    
    SUBHEADLINE
        : '##' (~[\r\n])+? '##'
        ;
    
    HEADLINE
        : '#' ('\\#'|~[\r\n])+? '#'
        ;
    
    LEAD
        : '###' (~[\r\n])+? '###'
        ;
    
    SUBHEADING
        : '####' (~[\r\n])+? '####'
        ;
    
    CAPTION
        : '#####' (~[\r\n])+? '#####'
        ;
    
    LISTING
        : '~~~~~' .+? '~~~~~'
        ;
    
    ELEMENTPATH
        : '[[[[[' (~[\r\n])+? ']]]]]'
        ;
    
    LABELREF
        : '{##' (~[\r\n])+? '##}'
        ;
    
    LABEL
        : '{#' (~[\r\n])+? '#}'
        ;
    
    ITALIC
        : '*' (~[\r\n])+? '*'
        ;
    
    SINGLE_COMMENT
        : '//' (~[\r\n])+ -> channel(1)
        ;
    
    MULTI_COMMENT
        : '/*' .*? '*/' -> channel(1)
        ;
    
    STAR
        : '*'
        ;
    
    BRACE_OPEN
        : '{'
        ;
    
    TEXT
        : (~[\r\n*{])+
        ;
    
    parser grammar dnpMDAuslagernParser;
    
    options { tokenVocab=dnpMDAuslagernLexer; }
    
    dnpMD
        : head body
        ;
    
    head
        : subheadline headline lead
        ;
    
    subheadline
        : SUBHEADLINE NL+
        ;
    
    headline
        : HEADLINE NL+
        ;
    
    lead
        : LEAD
        ;
    
    subheading
        : SUBHEADING
        ;
    
    caption
        : CAPTION
        ;
    
    listing
        : LISTING (NL listingPath)? (NL label)? NL caption
        ;
    
    image
        : caption (NL label)? (NL imagePath)?
        ;
    
    listingPath
        : ELEMENTPATH
        ;
    
    imagePath
        : ELEMENTPATH
        ;
    
    labelRef
        : LABELREF
        ;
    
    label
        : LABEL
        ;
    
    italic
        : ITALIC
        ;
    
    singleComment
        : SINGLE_COMMENT
        ;
    
    multiComment
        : MULTI_COMMENT
        ;
    
    paragraph
        : TEXT? italic TEXT?
        | TEXT? STAR TEXT?
        | TEXT? labelRef TEXT?
        | TEXT? BRACE_OPEN TEXT?
        | TEXT? LABEL TEXT?
        | ELEMENTPATH
        | TEXT
        ;
    
    newlines
        : NL+
        ;
    
    body
        : bodyElements+
        ;
    
    bodyElements
        : singleComment
        | multiComment
        | paragraph
        | subheading
        | listing
        | image
        | newlines
        ;
    

    This language is working fine and maybe someone can benefit from it.

    Thanks to all who helped out! Fabian

    0 讨论(0)
提交回复
热议问题