【问题标题】:Writing a parser with M, consume while not rule用 M 编写解析器,消费而不规则
【发布时间】:2009-11-25 07:06:50
【问题描述】:

我正在编写一个 HTML 解析器以供自己消遣,我想试试 M。

我的这项工作基于 HTML 4.01 标准,其中写着

虽然 STYLE 和 SCRIPT 元素 使用 CDATA 作为他们的数据模型, 这些元素,必须处理 CDATA 用户代理不同。标记和 实体必须被视为原始文本 并按原样传递给应用程序。 字符的第一次出现 序列“”(结束标记打开分隔符) 被视为终止 元素的内容。无效的 文件,这将是结束标签 为元素。

我想了一会儿,我真正想做的是这样的

syntax Main 
    = "<script>" Script "</script>"
    ;
token Script
    = TakeWhileNot("</") // this is not valid M grammar
    ;

我发现自己想要执行某种匹配的标记化规则,直到我到达一个开放的尖括号

如果转义序列是单个字符,这不会有问题,因为那时我可以写这个。

token Script
    = ScriptEscape+
    ;
token ScriptEscape
    = !"<"
    ;

这会起作用,不确定我是否以正确的方式进行此操作,但问题与我在另一种语言中嵌入了一种语言有关,但在这种情况下我不关心脚本语言所以我只是想跳过一个头。

【问题讨论】:

    标签: oslo mgrammar


    【解决方案1】:

    我想出了这个巧妙的技巧,但并不完全明显......

    syntax Main 
        = "<script>" Script* "</script>"
        ;
    token Script
        = !('<')
        | '<' !('/')
        ;
    

    现在这是有效的 MGrammar,翻译为:

    • 请勿使用 '

    这会消耗任何东西,直到遇到 标记而不消耗它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      相关资源
      最近更新 更多