用M编写解析器,消耗而不是规则

时间:2009-11-25 07:06:51

标签: oslo mgrammar

我正在为自己的娱乐编写一个HTML解析器,我想尝试M。

我的工作基于HTML 4.01标准,并在那里说

  

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

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

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

我发现自己发现我想要执行某种匹配的标记化规则,直到我达到一个开放的尖括号&lt;然后是正斜杠/.

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

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

这样可行,不确定我是否正确地采用了这种方式,但问题与我在另一种语言中嵌入了一种语言有关,但在这种情况下我并不关心脚本语言我只是想跳过头。

1 个答案:

答案 0 :(得分:0)

我想出了这个巧妙的伎俩,这并不是很明显......

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

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

  • 不要'&lt;'或者采取'&lt;'没有后跟'/'

在遇到&lt; / token之前会消耗掉任何东西。