Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR4的HTML/Markdown样式语法_Markdown_Antlr4 - Fatal编程技术网

ANTLR4的HTML/Markdown样式语法

ANTLR4的HTML/Markdown样式语法,markdown,antlr4,Markdown,Antlr4,我想为转换为AST的文档定义一个类似HTML/Markdown的语法。我知道,ANTLR4不是做降价的最好工具,但我离HTML的方向更近了。至少我认为我是。:) 以下是我对lexer的定义: lexer grammar dnpMDLexer; NL : [\r\n] ; HEAD_TAG : '#' ; HEADING_TEXT : ('\\#'|~[#`\r\n])+ ; ITALIC_TAG : '*' ; ITALI

我想为转换为AST的文档定义一个类似HTML/Markdown的语法。我知道,ANTLR4不是做降价的最好工具,但我离HTML的方向更近了。至少我认为我是。:)

以下是我对lexer的定义:

lexer grammar dnpMDLexer;

NL
    : [\r\n]
    ;

HEAD_TAG
    : '#'
    ;

HEADING_TEXT
    : ('\\#'|~[#`\r\n])+
    ;

ITALIC_TAG
    : '*'
    ;

ITALIC_TEXT
    : ('\\*'|~[#`*\r\n]).+?
    ;

LISTING_TAG
    : '`'
    ;

RUNNING_TEXT
    : ('\\#'|'\\`'|'\\*'|~[#*`])+
    ;
parser grammar dnpMDParser;

options { tokenVocab=dnpMDLexer; }

dnpMD
    : subheadline headline lead body
    ;

subheadline
    : HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG NL
    ;

headline
    : HEAD_TAG HEADING_TEXT HEAD_TAG NL
    ;

lead
    : HEAD_TAG HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG HEAD_TAG
    ;

subheading
    : HEAD_TAG HEAD_TAG HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG HEAD_TAG HEAD_TAG
    ;

listing
     : LISTING_TAG LISTING_TAG LISTING_TAG LISTING_TAG .+? LISTING_TAG LISTING_TAG LISTING_TAG LISTING_TAG
     ;

italic
    : ITALIC_TAG ITALIC_TEXT ITALIC_TAG
    ;

body
    : RUNNING_TEXT body
    | subheading body
    | listing body
    | italic body
    | EOF
    ;
下面是我的解析器定义:

lexer grammar dnpMDLexer;

NL
    : [\r\n]
    ;

HEAD_TAG
    : '#'
    ;

HEADING_TEXT
    : ('\\#'|~[#`\r\n])+
    ;

ITALIC_TAG
    : '*'
    ;

ITALIC_TEXT
    : ('\\*'|~[#`*\r\n]).+?
    ;

LISTING_TAG
    : '`'
    ;

RUNNING_TEXT
    : ('\\#'|'\\`'|'\\*'|~[#*`])+
    ;
parser grammar dnpMDParser;

options { tokenVocab=dnpMDLexer; }

dnpMD
    : subheadline headline lead body
    ;

subheadline
    : HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG NL
    ;

headline
    : HEAD_TAG HEADING_TEXT HEAD_TAG NL
    ;

lead
    : HEAD_TAG HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG HEAD_TAG
    ;

subheading
    : HEAD_TAG HEAD_TAG HEAD_TAG HEAD_TAG HEADING_TEXT HEAD_TAG HEAD_TAG HEAD_TAG HEAD_TAG
    ;

listing
     : LISTING_TAG LISTING_TAG LISTING_TAG LISTING_TAG .+? LISTING_TAG LISTING_TAG LISTING_TAG LISTING_TAG
     ;

italic
    : ITALIC_TAG ITALIC_TEXT ITALIC_TAG
    ;

body
    : RUNNING_TEXT body
    | subheading body
    | listing body
    | italic body
    | EOF
    ;
我在ANTLRworks2和IntelliJ中用ANTLR4插件尝试了这些东西

我对列表和斜体规则有很大的问题。在某些情况下,匹配的方式非常多,而在其他情况下则没有匹配。在上述版本中,斜体样式不起作用

我的方向对吗?我尝试使用HTML语法作为模板。不太确定ANTLR4模式是否能帮助我区分标记的外部文本和内部文本

也许有人有一些有用的提示。我很感激我能得到的每一个提示,因为我不能100%确定我在这个问题上的工作方式是否会引导我走向正确的方向

这是ANTLRworks2中的测试装备的图像。第二个斜体规则是匹配的方式多

谢谢,
Fabian

当前的解决方案类似于以下词法和语法规则:

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
    ;
这种语言很好用,也许有人能从中受益

感谢所有帮助过我的人!
Fabian

查看下面我的答案,了解一种可能的方法。