感谢这里关于堆栈溢出和一些小时工作的答案;),我的语法终于按预期工作了。只有一些小问题或凌乱的情况。
这是我的词法分析器定义:
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
;
看起来lexer文件开头的成员定义在使用ANTLR4插件的IntelliJ IDEA中不起作用?或者我在定义中遗漏了什么。
在标题的定义中,我试图允许开始白色空间。但无论我尝试什么,解析过程都会失败。我添加了一个WS令牌[\ t] +但是当我将WS令牌添加到规则时它会被忽略。不太确定究竟是什么失败了。
但更大的问题是段落规则。有许多子规则,他们尝试匹配段落的元素。例如文本或其他一些东西。
我想把这个段落用作一个块,所以我知道在解析过程之后,我可以在这个段落周围添加一个div oder。因为这一段中的所有内容都是一组文字。段落本身与换行符分开。这很有效。
但是在IntelliJ IDEA树视图中,我可以在树中看到不同的段落条目。例如段落:1,段落:2等。那是因为规则不同。
是否有办法在解析器树中包含一个段落条目,并在其下面包含所有文本?只是按换行分开?
我尝试了另一条规则作为段落的顶级规则,但这不起作用。 :(
答案 0 :(得分:0)
使用以下规则可以避免使用不同的段落:
paragraph
: (TEXT? italic TEXT?
| TEXT? STAR TEXT?
| TEXT? labelRef TEXT?
| TEXT? BRACE_OPEN TEXT?
| TEXT? LABEL TEXT?
| ELEMENTPATH
| TEXT
)+
;
成员定义,我想用于不同的渠道,不应该这样做。新渠道定义更好:
channels {
COMMENTS
}
该语言独立且效果很好。