2016-05-28 60 views
0

我想爲轉換爲AST的文檔定義HTML/Markdown語法。我知道,ANTLR4並不是做Markdown事情的最佳工具,但我更接近HTML方向。至少我認爲我是。 :)ANTLR4的HTML/Markdown樣式語法

這裏是我的詞法分析器定義:

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的圖像。第二個斜體規則是相匹配的方式。

enter image description here

感謝, 費邊

+0

請參閱下面的答案,瞭解一種可行的方法。 – FDeitelhoff

回答

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 
    ; 

這種語言是工作的罰款,也許有人可以從中受益。

感謝所有幫助過的人! Fabian