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,BOLDITALIC之一时,您不断翻转一些布尔标志。

我还没有正确测试过我的语法,所以我不打算在这里发布整个语法。

祝你好运!

+0

谢谢 - 你在mediawiki语法中找到了什么地方吗?我开始认为即使是Antlr的LL(*)解析器也无法处理它的糟糕的标记设计,我应该用一些替换字符串将它变成克里奥尔语,并为此建立一个语法。 – 2011-03-27 10:23:05

+0

@Chris,是的,我差不多完成了。但是有太多含糊之处,我开启了全球回溯(并且为了提高性能,还启用了记忆功能)。由于这个原因,ANTLR需要大约20秒才能创建词法分析器和解析器,我必须将堆空间增加到256 MB。当然,在解析实际的Wiki源代码时,我不需要太多RAM,只需要生成词法分析器和分析器就需要相当多的堆空间。祝你好运! – 2011-03-27 10:33:59

+0

听起来像ANTLR不是维基引擎(或任何其他类似Gold解析器/ Grammatica的解决方案,但它们打破无效标记) – 2011-03-27 10:51:06