当前位置: 首页 > 知识库问答 >
问题:

标记前面的空格和规则拆分

尚恩
2023-03-14

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

以下是我对lexer的定义:

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-order或其他内容。因为这一段中的所有内容都是一组文本。段落本身用换行符分开。这很有效。

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

有没有办法在解析器树中有一个段落条目,并且在它下面都包含文本?只是用换行符拆分?

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

共有1个答案

赵智
2023-03-14

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

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

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

channels {
    COMMENTS
}

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

 类似资料:
  • 我在facets上有一些问题,用空格标记标签。 我有以下映射: 我的问题是: 输出结果为: 现在,我在facets中得到了total 0,在hits中得到了total:0 知道为什么它不能工作吗? 我知道,当我从标记中删除关键字分析器并使其为“not_analysis”时,我会得到结果。 但是仍然存在区分大小写的问题。 如果通过删除关键字分析器来运行上述相同的查询,则得到的结果是: 这里的Vict

  • 问题内容: 如果我有一个类似“ 11E12C108N”的字符串,该字符串是字母组和数字组的串联,那么如何在没有分隔符的情况下拆分它们? 例如,我希望得到的拆分为: 我现在有这个。 这给了我: 我可以一次完成原始正则表达式的完全分割吗?不必在中间令牌上再次运行正则表达式? 问题答案: 使用以下正则表达式,并获取所有匹配项的列表。那就是您要寻找的。 在Java中,我认为代码如下所示:

  • Codeing Standard freeRTOS的源代码符合MISRA编码标准,这个编码标准老长了,而且想要得到这玩意还有向MISRA付一点点小钱,所以下面只复制了一小部分。 脱离MISRA标准的部分: 两个API有多余一个出口。在这两种情况下,出于对临界效率的原因,同标准的偏差是允许的 当在创建任务的时候,源代码在为任务创建堆栈的时候,需要操作内存去定位起始与结束地址,因为源代码需要在所有支持

  • 我正在阅读关于reinterpret_cast的笔记,它是混淆现象(http://en.cppreference.com/w/cpp/language/reinterpret_cast)。 我写了代码: 我认为这些规则在这里不适用: T2是对象的(可能是cv限定的)动态类型 T2和T1都是指向相同类型T3的指针(可能是多级的,可能在每个级别都是cv限定的)(因为C11) T2是一个聚合类型或并集类

  • 问题内容: 当使用Python的etree创建XML文件时,如果使用将空标签写入文件,则会得到: 不幸的是,即使它是正确的标签,我们在Fortran中使用的XML解析器库也无法处理此问题。它需要看到: 有没有一种方法可以更改格式化规则或etree中的某些方法来完成这项工作? 问题答案: 从Python 3.4开始,您可以在函数和方法中使用参数: 在较旧的Python版本(2.7到3.3)中,作为一