0

我正在编写一个 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
    = !"<"
    ;

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

4

1 回答 1

0

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

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

现在这是有效的 MGrammar,它转化为:

  • 不要带'<'或带'<'而不是'/'

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

于 2009-11-26T20:48:52.050 回答