ANTLR中的Mediawiki解析:处理'令牌
问题描述:
我试图写一个语法来解析Media wiki's wiki syntax,之后Creole syntax too(遗憾的是existing Creole grammar在Antlr 3中不起作用)。ANTLR中的Mediawiki解析:处理'令牌
我现在的问题是能够捕捉一个大胆的规则,当我已经在一个斜体规则,或反之亦然。例如
'' this text is bold '''now it's italic''' and just bold again''
我有很大的帮助,从this question但我坚持。目标是在语法中使用动作或可能的AST生成HTML - 我不确定哪个最好。
答
作为练习,我创建了一个链接到MediaWiki分析器,以及和不匹配开放和关闭标签的粗体和斜体,而是调用这样的切换:
grammar MediaWiki;
options {
output=AST;
backtrack=true;
memoize=true;
}
...
// entry point of the parser
parse
: atom+ EOF -> ^(ROOT atom+)
;
atom
: formatToggle
| horizontalRule
| header
| link
| list
| preFormattedText
| table
| ...
| any
;
formatToggle
: SQt SQt SQt SQt SQt -> BOLD_ITALIC
| SQt SQt SQt -> BOLD
| SQt SQt -> ITALIC
;
...
SQt
: '\''
;
在
然后MediaWiki格式的翻译(转换为HTML?),当遇到BOLD_ITALIC
,BOLD
或ITALIC
之一时,您不断翻转一些布尔标志。
我还没有正确测试过我的语法,所以我不打算在这里发布整个语法。
祝你好运!
谢谢 - 你在mediawiki语法中找到了什么地方吗?我开始认为即使是Antlr的LL(*)解析器也无法处理它的糟糕的标记设计,我应该用一些替换字符串将它变成克里奥尔语,并为此建立一个语法。 – 2011-03-27 10:23:05
@Chris,是的,我差不多完成了。但是有太多含糊之处,我开启了全球回溯(并且为了提高性能,还启用了记忆功能)。由于这个原因,ANTLR需要大约20秒才能创建词法分析器和解析器,我必须将堆空间增加到256 MB。当然,在解析实际的Wiki源代码时,我不需要太多RAM,只需要生成词法分析器和分析器就需要相当多的堆空间。祝你好运! – 2011-03-27 10:33:59
听起来像ANTLR不是维基引擎(或任何其他类似Gold解析器/ Grammatica的解决方案,但它们打破无效标记) – 2011-03-27 10:51:06