需要帮助将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等价,它也包括一些测试。
希望它可以帮助:-)