各种标记语言都有关闭标签, 是解析器太弱的原因吗?

题叶
  • 17.3k

HTML 有关闭标签, 微软的 XAML 有关闭标签, Flex 开发有关闭标签, 基于 XML 衍生的也都有,
感觉比较反人类的设计...

我尝试过 pegjs, 相比关闭标签的方式, 缩进似乎难得多, 其他的词法解析方案是不是也类似, 成本太大所以人们都宁愿别人开发时候搞一堆关闭标签?


update:

主要讨论常用开发中的 HTML, XML 衍生语言等等, 文本标记语言比如 Markdown 不在讨论范围里.

现在已有 Jade, HAML, Slim, Blade 等多种编译解析到 HTML 的语言, 证明技术上完全是成熟的, 这样大家都用 XML 这样的标记语言, 多少让人怀疑是为了那么一点点开销么?

回复
阅读 5.2k
3 个回答
oyiadin
  • 173

有闭合标签更容易于解析,而且反之容易造成歧义。

比如我举个 HTML 的例子:

<div>
    <span>
        <a href="#tag2">tag 2</a>
    </span>
    <a href="#tag3">tag 3</a>
</div>

如果省略闭合标签:

<div>
    <span>
        <a href="#tag2">tag 2
    <a href="#tag3">tag 3

解析器便无法确定代码的真正意图了:tag 3 究竟是在 span 的外面还是里面?傻傻分不清楚 :-)


其实其他编程语言的语句块也是一样:C++ 的 {...},Ruby 的 begin...end,Lisp 的 (...) 等,都需要有明确的层次分割。毕竟没闭合的标签人类都解析不了 ;)

依云
  • 24.9k

因为它们属于同一类标记语言。很多是衍生自 XML。XML 是衍生自 HTML,后来有了 SGML。XAML 是 XML。很多 *ML 等也是 XML。

另外,也不是所有「标记」语言都是这个样子的。比如 YAML、HAML,以及一些写文档用的 markdown、asciidoc、reStructuredText 等。

不是解析器太弱了,是人太弱了。

首先可以确认,括号或者 begin end 也算是有闭合标签的。
那么,解析一个代码时需要把这个代码分析为语法树,那么这里就有一个问题,怎么辨别出哪行代码属于那个分枝的,这个学习C语言的时候,很多人都遇到过忘记加大括号而出现一些和你想想的不一样的结果吧,这就是由于你理解的应该建的语法树与实际上建的语法树不同的原因。

也就是使用什么方法来标记这个语句是哪个节点的儿子。

假设不使用括号,则只能使用空格来区分了,那么对于代码来说就不存在格式化这一说了(因为空格改变了,语法树就改变了)

也就是说语法树的建立需要人来严格控制,一不小心将会生成不同的语法树,可以称为错误的语法树。

我们人类可以做到这个吗?可以的,但是代价太大了,要做一个项目,几W行的代码,自己控制语法树,太难了。

上面也有人说了,不严格的说空格也算闭合标签,这个假设成立的话,那你不使用闭合标签怎么建立你的语法树呢?

应该 不能吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏