2016-06-07 27 views
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 
    ; 

看起來像在詞法分析器文件的開頭的成員定義不IntelliJ IDEA的工作用ANTLR4插件?或者我在定義中遺漏了一些東西。

在標題的定義中,我嘗試允許開始空格。但無論我嘗試,解析過程失敗。我添加了WS令牌[\ t] +,但是當我將WS令牌添加到規則時,它將被忽略。不太確定究竟是什麼失敗。

但是更大的問題是段落規則。有許多子規則,他們嘗試匹配段落的元素。例如文字或其他東西。

我想使用這個段落作爲一個塊,所以我知道解析過程後,我可以在本段添加div或其他東西。因爲本段中的所有內容都是一組文本。段落本身與換行符分開。這很好。

但是在IntelliJ IDEA樹視圖中,我可以在樹中看到不同的段落條目。例如第1段,第2段等。那是因爲不同的規則。

有沒有辦法在解析器樹中有一個段落條目,並且所有包含它的文本在下面?只是換行換行?

我試過另一個規則作爲段落中的第一個,但那不起作用。 :(

回答

0

不同款項目可以用下面的規則來避免:

paragraph 
    : (TEXT? italic TEXT? 
    | TEXT? STAR TEXT? 
    | TEXT? labelRef TEXT? 
    | TEXT? BRACE_OPEN TEXT? 
    | TEXT? LABEL TEXT? 
    | ELEMENTPATH 
    | TEXT 
    )+ 
    ; 

和成員的定義,我想用不同的渠道,應該不是這樣做的新渠道定義。是更好的方式:

channels { 
    COMMENTS 
} 

這是獨立於語言和工作得很好。