令Σ为非空的有限符号集,称为字母表。然后,∑ *是可数的无限个有限词集,可以通过将Σ中的零个或多个符号串联而形成。任何定义良好的子集大号 ⊆Σ*是一种语言。
让我们将其应用于XML。它的字母是Unicode字符集U,它是非空且有限的。并非每个零个或多个Unicode字符的串联都是格式正确的XML文档,例如字符串
<tag> soup &; not <//good>
显然不是。构成格式正确的XML文档的XML子集U * 是可确定的(或“递归”)。存在的是作为输入的任何单词的机器(算法或计算机程序)瓦特 ∈ ü *和一个有限的时间量,输出是1,如果后瓦特 ∈XML,否则为0。这样的算法是任何XML处理软件的子例程。并非所有语言都是可决定的。例如,在有限的时间内终止的有效C程序集不是(这称为暂停问题))。当设计一种新语言时,要做出的一个重要决定就是它应该尽可能强大,还是为了更好地确定性而更好地限制表达性。
一些语言可以通过来定义的语法,据说能够产生的语言。语法由
- 一组有限的文字(也称为终端符号),
- 一个不相交的有限的语法变量集(也称为非终结符),
- 杰出的启动符号,来自所述组的变量取和
- 有限的一组规则(所谓的生产),其允许某些种替换所组成。
任何仅由文字组成的单词都可以通过以起始符号开头然后应用给定的规则来派生,这些单词都属于语法产生的语言。
例如,以下语法(用非正式的表示法)使您可以精确得出十进制表示法中的整数。
- 语法的文字是数字
1
,2
,3
,4
,5
,6
,7
,8
,9
,和0
。
- 变量是符号小号和d。
- S是起始符号。
- 任何出现的变量S都可以替换
- 任何出现的变量D都可以替换
- 后面加上任何文字,然后是变量D的另一个实例或
- 由空字符串组成。
这是我们的推导方法42
:
S-(应用规则4,第二个变体)→ 4
D-(应用规则5,第一个变体)→ 42
D-(应用规则5,第二个变体)→ 42
。
根据您在语法中允许的复杂规则,需要使用各种复杂的机器来证明给定的单词实际上可以由语法产生。上面给出的示例是一个常规语法,它是最简单,功能最弱的。下一类强大的语法称为上下文无关。这些语法也很容易验证。XML(除非我忽略了一些我不知道的晦涩功能)可以用上下文无关的语法来描述。语法的分类形成了语法(因此语言)的乔姆斯基层次结构。语法可以描述的每种语言至少是半确定的(或“递归枚举”)。即,存在一种机器,给定实际上属于该语言的单词,该机器得出证明它可以在有限时间内由语法产生的证明,并且永远不会输出错误的证明。这样的机器称为验证程序。请注意,如果输入的单词实际上不属于该语言,则该机器可能永远不会停止运行。显然,我们希望用功能较弱的语法来描述我们的编程语言,以便能够在有限的时间内拒绝无效程序。
Schemata是XML的补充,允许完善格式正确的文档集。遵循某种模式的格式正确的文档根据该模式称为有效。例如,字符串
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
是格式正确的XML文档,但不是有效的XHTML文档。存在用于XHTML,SVG,XSLT以及其他的模式。模式验证也可以通过一种算法来完成,该算法可确保在每个输入经过有限数量的步骤后停止运行。这样的程序称为验证器或验证解析器。图式由所谓的scema定义语言定义,这是一种正式定义语法的方式。XSD是XML的官方模式定义语言,它本身是基于XML的。RELAX NG是XSD的一种更优雅,更简单且功能稍逊的替代方案。
因为您可以定义自己的模式,所以XML被称为可扩展语言,它是“ XML”中“ X”的起源。
您可以定义一组规则,使XML文档可以解释为计算机程序的描述。前面提到的XSLT是使用XML构建的这种编程语言的示例。更一般而言,如果需要的话,可以将几乎所有编程语言的抽象语法树很自然地序列化为XML。