我想为转换为AST的文档定义HTML / Markdown语法。我知道,ANTLR4不是做Markdown事情的最佳工具,但我更接近HTML方向。至少我想我是。 :)
这是我的词法分析器定义:
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中TestRig的图像。第二个斜体规则是匹配方式。
谢谢, 费边
答案 0 :(得分:0)
当前的解决方案看起来像这个词法分析器和语法规则:
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
;
这种语言工作正常,也许有人可以从中受益。
感谢所有帮助过的人! 费边