代币前面的空白区域和规则拆分



感谢这里关于堆栈溢出的回答和一些小时的工作;),我的语法终于如愿以偿了。只是一些小问题或混乱的情况。

这是我的lexer定义:

lexer grammar dnpMDAuslagernLexer;
/*@members {
public static final int COMMENTS = 1;
}*/
NL
: [rn]
;
SUBHEADLINE
: '##' (~[rn])+? '##'
;
HEADLINE
: '#' ('\#'|~[rn])+? '#'
;
LEAD
: '###' (~[rn])+? '###'
;
SUBHEADING
: '####' (~[rn])+? '####'
;
CAPTION
: '#####' (~[rn])+? '#####'
;
LISTING
: '~~~~~' .+? '~~~~~'
;
ELEMENTPATH
: '[[[[[' (~[rn])+? ']]]]]'
;
LABELREF
: '{##' (~[rn])+? '##}'
;
LABEL
: '{#' (~[rn])+? '#}'
;
ITALIC
: '*' (~[rn])+? '*'
;
SINGLE_COMMENT
: '//' (~[rn])+ -> channel(1)
;
MULTI_COMMENT
: '/*' .*? '*/' -> channel(1)
;
STAR
: '*'
;
BRACE_OPEN
: '{'
;
TEXT
: (~[rn*{])+
;

下面是解析器的定义:

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
;

看起来lexer文件开头的成员定义在带有ANTLR4插件的IntelliJ IDEA中不起作用?或者我在定义中遗漏了什么。

在标题的定义中,我尽量留出空白。但无论我尝试了什么,解析过程都失败了。我添加了一个WS令牌[\t]+,但当我将WS令牌添加到规则中时,它会被忽略。不太确定到底是什么失败了。

但更大的问题是段落规则。有许多子规则,它们试图匹配段落的元素。例如文本或其他内容。

我想把这个段落用作一个块,这样我就知道在解析过程之后,我可以在这个段落周围添加一个div或其他东西。因为这段话里的每一句话都是一组文字。段落本身用换行符分隔。这很有效。

但在IntelliJ IDEA树视图中,我可以在树中看到不同的段落条目。例如第1段、第2段等等。这是因为规则不同。

有没有一种方法可以在解析器树中有一个段落条目,并且所有条目都包含它下面的文本?只是被换行符分开?

我尝试了另一条规则作为段落的顶部,但不起作用(

不同的段落条目可以通过以下规则避免:

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

我想用于不同频道的成员定义不应该这样做。新的通道定义要好得多:

channels {
COMMENTS
}

这是独立于语言的,效果很好。

最新更新