【问题标题】:Mediawiki parsing in ANTLR: processing ' tokensANTLR 中的 Mediawiki 解析:处理 ' 标记
【发布时间】:2011-03-26 11:31:59
【问题描述】:

我正在尝试编写一个语法来解析 Media wiki's wiki syntax,然后是 Creole syntax too(不幸的是 existing Creole grammar 在 Antlr 3 中不起作用)。

我现在的问题是当我已经在斜体规则中时能够捕获粗体规则,反之亦然。例如

'' this text is bold '''now it's italic''' and just bold again''

this question 给了我很多帮助,但我被困住了。目标是使用动作在语法中生成 HTML,或者可能是 AST - 我不确定哪个是最好的。

【问题讨论】:

    标签: antlr token rules antlr3


    【解决方案1】:

    作为一个练习,我还创建了一个 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_ITALICBOLDITALIC 之一时,您会不断翻转一些布尔标志。

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

    祝你好运!

    【讨论】:

    • 谢谢 - 您对 mediawiki 语法有所了解吗?我开始认为即使是 Antlr 的 LL(*) 解析器也无法处理它糟糕的令牌设计,我应该通过一些字符串替换将它变成克里奥尔语,并为此构建一个语法。
    • @Chris,是的,我快完成了。但是有很多歧义,我打开了全局回溯(为了提高性能,还启用了记忆)。因此,ANTLR 需要大约 20 秒来创建词法分析器和解析器,我必须将堆空间增加到 256 MB。当然,在解析实际的 Wiki 源时我不需要那么多 RAM,只生成词法分析器和解析器需要相当多的堆空间。祝你好运!
    • 听起来 ANTLR 对于 wiki 引擎(或任何其他类似 Gold parser/Grammatica 但它们会因无效标记而中断)来说不是一个可行的解决方案
    • @Chris,我同意,单个解析器/语法并不理想。但是,正如我在您链接到的帖子中所建议的那样,我认为可以使用多个解析器来完成,您可以使用 ANTLR(但我自己没有这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2022-01-12
    相关资源
    最近更新 更多