需要帮助将ANTLR语法转换为pyparsing

需要帮助将ANTLR语法转换为pyparsing

问题描述:

我有一个项目,它仍然是胚胎,我试图用真正的语法编写wiki解析器。我发现一个似乎相当完整的Creole grammar,并且被第三方证实可以工作(与ANTLR)。需要帮助将ANTLR语法转换为pyparsing

我已经开始向前移动,但是遇到了一些障碍,我假设pyparsing是一个常见的绊脚石。

escaped 
    : ESCAPE STAR STAR 
    | ESCAPE . 
    // '.' in a parser rule means arbitrary token, not character 
    ; 

我想出了这个是:

ESCAPE = Literal('~') 
STAR = Literal('*') 
escaped = ESCAPE + STAR + STAR | ESCAPE + Word(printables, max=1) 

我找不到任何在pyparsing匹配单个字符一样,但是这似乎工作。但是看标题内容时,我有这个子表达式:

heading_content 
    : heading_markup heading_content (heading_markup)? 
    | (~(EQUAL | ESCAPE | NEWLINE | EOF) | escaped)+ 
    ; 

我使用的是前锋,但对于第二部分,我结束了:

OneOrMore(CharsNotIn("=~\r\n") | escaped)('heading_content') 

现在这个匹配“测试”和“测试〜=”而不是“测试〜= foo”,它只匹配“测试”部分。这是为什么?

其次,我想知道是否有另一种方式来指定除CharsNotIn以外的内容部分?

现在真正让我难过的一点是试图匹配未格式化的文本部分。这是匹配各种纯文本的核心。现在语法规定:

text_unformatted 
    : (~( ITAL 
     | STAR 
     | LINK_OPEN 
     | IMAGE_OPEN 
     | NOWIKI_OPEN 
     | EXTENSION 
     | FORCED_LINEBREAK 
     | ESCAPE 
     | NEWLINE 
     | EOF) 
    | forced_linebreak 
    | escaped)+ 

这就是我撞墙的地方。现在,上述简单的位定义为:

# STAR, ESCAPE and escaped defined above 
ITAL = Literal('//') 
LINK_OPEN = Literal('[[') 
IMAGE_OPEN = Literal('{{') 
NOWIKI_OPEN = Literal('{{{') 
EXTENSION = Literal('@@') 
FORCED_LINEBREAK = Literal(r'\\') 
CR = Literal('\r') 
LF = Literal('\n') 
NEWLINE = Optional(CR) + LF | CR 

但是我的一次或更多的幼稚的方法(NotAny(...)| FORCED_LINEBREAK |转义)没有工作,结束了无限循环。多读一些文档表明NotAny实际上不会返回任何匹配。那么我们如何匹配呢?我不能使用CharNotIn(...),因为一个'{'是完全有效的。

指针赞赏。

前一段时间,我写了写在pyparsing对ANTLR语法转换器,这可能是有帮助的,我提交了它作为pyparsing票功能要求:

http://sourceforge.net/tracker/index.php?func=detail&aid=3060671&group_id=97203&atid=617314

的ANTLR语法是几乎完全,所以它可能会完成这项工作,否则,它可能是一个有用的信息来源,如何对antlr语法进行pyparsing等价,它也包括一些测试。

希望它可以帮助:-)