令牌前面的空格和规则分割

时间:2016-06-07 20:38:21

标签: parsing antlr4

感谢这里关于堆栈溢出和一些小时工作的答案;),我的语法终于按预期工作了。只有一些小问题或凌乱的情况。

这是我的词法分析器定义:

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等。那是因为规则不同。

是否有办法在解析器树中包含一个段落条目,并在其下面包含所有文本?只是按换行分开?

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

1 个答案:

答案 0 :(得分:0)

使用以下规则可以避免使用不同的段落:

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

成员定义,我想用于不同的渠道,不应该这样做。新渠道定义更好:

channels {
    COMMENTS
}

该语言独立且效果很好。