感謝這裏關於堆棧溢出和一些工作時間的答案;),我的語法終於按預期工作。只有一些小問題或混亂的情況。令牌和規則拆分前的空白
這裏是我的詞法分析器定義:
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
;
看起來像在詞法分析器文件的開頭的成員定義不IntelliJ IDEA的工作用ANTLR4插件?或者我在定義中遺漏了一些東西。
在標題的定義中,我嘗試允許開始空格。但無論我嘗試,解析過程失敗。我添加了WS令牌[\ t] +,但是當我將WS令牌添加到規則時,它將被忽略。不太確定究竟是什麼失敗。
但是更大的問題是段落規則。有許多子規則,他們嘗試匹配段落的元素。例如文字或其他東西。
我想使用這個段落作爲一個塊,所以我知道解析過程後,我可以在本段添加div或其他東西。因爲本段中的所有內容都是一組文本。段落本身與換行符分開。這很好。
但是在IntelliJ IDEA樹視圖中,我可以在樹中看到不同的段落條目。例如第1段,第2段等。那是因爲不同的規則。
有沒有辦法在解析器樹中有一個段落條目,並且所有包含它的文本在下面?只是換行換行?
我試過另一個規則作爲段落中的第一個,但那不起作用。 :(