本文档是Unicode技术说明。其内容由作者承担全部责任。发布并不意味着Unicode联盟的任何认可。本文档不受Unicode专利政策的约束。
这是BIDI DUMMIES课程。完成本课程后,您将能够根据Unicode双向算法(简称UBA)识别括号对。您还可以在简历中添加您已完成BFD课程的内容。
本课程没有真正的必备条件。你甚至不需要理解双向文本的概念,或者为什么UBA会存在。我们将重点介绍在UBA中匹配规则N0的括号对所需了解的内容。(不,这不是EN OH&34;NO&34;-它是EN ZERO&34;N0&34;。)。
是的,正确。但实际上,在UBA中,许多其他的东西也被标识为括号。因此,圆括号被认为是方括号,大括号也被认为是方括号。这个括号叫做方括号,所以我们可以把它与其他所有的括号区分开来。
基本上,任何成对出现的标点符号都被认为是括号,这些标点符号被用来将文本中的内容与标记外的其他内容隔开。除了人们通常在键盘上识别的标点符号之外,还有许多其他标点符号,包括这样的古怪符号,比如ASU+29FC⧼左指向弧形尖括号和U+2E26⸦左侧U括号。在UNICODE中甚至有一些括号甚至不称为括号或括号。
-引号怎么样?他们成双成对地进来,把东西围在里面,把它和外面的所有东西隔开。他们中的一些人,比如那个法国人<甚至看起来像括号。
-但我以为那是日文引号。为什么是括号,而其他引号不是?
它可能与数学有关,但不管怎样,它是一个括号。另外,如果你是个不错的木匠,你就会知道什么是地板支架。
因为这是一个不太好的标志。我受够了所有这些愚蠢的问题,为什么?为什么不?
你们的作业是记住BidiBrackets.txt[括号]中的代码点和字符名称列表。这份列表定义了UBA的所有括号,但你可能认为其他什么是括号并不重要。这就是列表,事实就是这样。
如果你注意了第一章的内容,你可能已经注意到,所有的方括号的名字中都有左括号。不出所料,他们的名字中也有右括号对应的括号,这一点并不令人惊讶。(注:在第一章中,你可能已经注意到,所有的括号名称中都有左括号和右括号,这一点并不令人感到意外。)(这句话的意思是:如果你注意了第一章的内容,你可能已经注意到,所有的括号的名字里都有左括号。)。
左和右版本的括号彼此成对。所以[#34;是";]";的左版,反之亦然。它们组成一对。通常它们是彼此的图形镜子。该对的左侧指向右侧,该对的右侧指向左侧。
好的,这样想吧。该对的左边出现在它所包围的文本的左侧,而这对的右边出现在它所包围的文本的右边。这样说清楚了吗?
嗯,现在不用担心这个了。请记住,您不需要理解双向文本即可了解括号对的标识。所以就当我没提过吧。重要的是要知道,左边的那个和右边的那个是成对的,最后,它们指向的方向或者它们所包含的文本实际上在哪里,这都不重要,好吗?
-现在等一下.。我做了功课,名单上有一样东西叫藏族马克·古格·RTAGS Gyon。它的名字里没有留下。这是怎么回事?
-你骗不了我-我也没有在OGHAMFEATHER MARK中看到左边。你不能让我相信羽毛的意思是左边。
那只与奥格姆反面羽毛印记成对。你知道他们怎么说愚蠢的一致性,对吗?
不管怎么说,重点是所有的括号都是成对的。即使他们的名字中没有左或右,你也总能分辨出哪一个是和另一个配对的。如果这并不总是显而易见的,那么解决这个问题的方法就是回到BidiBrackets.txt。该文件每行中的第二个数字是组成该对的字符。
所以,对于那些还在继续学习的人来说,下一件要知道的事情是,两个对中的左方括号也称为左方括号,右方括号也称为右方括号。您在BidiBrackets.txt的每一行上看到的神秘的";o";和";c";代表";o&34;c";失败。";o";或";c";值是如何区分一对中的哪一个是哪一个,即使字符实际上没有";Left&34;或#。知道哪一个是开始的,哪个是结束的,这真的非常重要,因为计算出在一长行文本中,哪个特定的括号可以与哪个特定的其他括号配对,这取决于能够找到所有的开始和结束的括号。
但这里还有另一个复杂的问题。事实证明,有些括号是其他括号的典范等价物,这些括号也是成对计算的。
嗯,根据Unicode标准化算法,一些尖括号与其他尖括号规范等价,而且由于在大多数文本处理中无法真正区分规范等效项,因此在识别方括号对时将它们分开并不是一个好主意。(注:根据Unicode规范化算法,一些尖括号与其他尖括号是规范等价的,因此在大多数文本处理中无法真正区分规范等价项,所以在识别方括号对时,将它们分开并不是一个好主意。
管他呢。我说的不是尖括号,我指的是U+2329〈左尖尖括号和左尖括号,它们彼此相同,但不是你想要的那个尖括号。(这两个词是一样的,但不在你想的那个尖括号之外。)我不是在说U+2329的左尖括号和这两个左尖括号,它们彼此是一样的,但它们不是你想要的那个尖括号。(这句话的意思是:我不是在说U+2329的左尖括号,它们是一样的,但它们不是你想要的那个尖括号。)。
-呃.。我讨厌哑巴的Unicode规范化课程-它太令人困惑了。
嗯,至少在这一点上你是对的!现在,只需记住U+3008与U+3009配对,U+2329与U+232A配对,但U+3008也与U+232A配对,U+3009也与U+2329配对。这就像必须知道,Pair也拼写为pear&34;-只是我们在这里谈论的这对是梨,而是尖括号,尽管它们是尖括号角括号。
本章的作业是返回BidiBrackets.txt[方括号]并记住列表中的所有";o";和";c";值,这样您就知道每对中的哪个字符是开始字符或结束字符。
在第二章中,我们学习了所有关于哪些括号与哪些括号配对的知识。但事实证明,到目前为止,这些信息都是抽象的。我们可以认为这是方括号对的语义,因为它是它们意义的真理,与它们在文本中的任何用法无关。一个左方括号正在打开,只是因为它是什么和它的意思。它在文本中出现在哪里并不重要。
但是,确定哪些括号对和哪些其他括号对要比记住BidiBrackets.txt中的所有信息并知道哪些括号正在打开、哪些括号正在关闭要复杂得多。
那我在说什么呢?让我们从几个例子开始吧。在以下简短的文本中:
开头";(";与结尾";)";配对。然后,我们将文本解释为括号内的文本,或者更一般地解释为括号内的文本,因为我们这里泛指的是括号对。我们关心的不是芝加哥风格手册[CMS],也不是确切的应该在哪里使用哪些括号,而是找出哪个左括号和哪个结束括号相配。它们是不是对的(或者,嗯,对的)并不重要。因此,就我们的目的而言,同样值得考虑的是:
然而,重要的是要注意到这些事件发生的确切顺序。如果文本更改为:
我们将不再认为该特定的&34;]&34;与该特定的";[";]配对。它们在这里的顺序是错误的。原则上,结束的";]";可能会与行左侧的某个开始##34;[";]配对,但在这里看不到。这个字母可能会与文本中前面某个地方的其他字母配对。“。但是这两个并不是相互配对的,因为它们在这里出现的顺序是错误的,被认为是匹配的配对。
-等等!在这种情况下,我不能只将";]&34;重新定义为开始而将";[";重新定义为结束吗?我有点喜欢欧姆定律的样子!
不是的。嗯,我想在另一个世界也许你可以,但我们有了UBA就不行了。记住,我告诉过您要记住BidiBrackets.txt中的开场值和结束值--不要质疑它们。
无论如何,这里的要点是,对于任何特定文本中的任何特定括号,你遇到它们的顺序是完全重要的。";(^.^)";包含方括号对-嗯,它也可能包含表情符号,但这是另一门课程的主题。";)^.^(";另一方面,不包含方括号对(但可能包含Anpanman)。
另外,如果我有两个左括号,如";(^.^(";),这两个括号(嗯,圆括号,但随便啦!)。也不要互相配对。它们可能会在稍后的课文中与一些右括号配对,但不会像我们在那里那样,在课文中彼此配对。记住,这里的总原则是两个左不等于右,两个右不等于左。:-):-)。
本章的作业是思考遗漏文本的认识论含义和事物的顺序。
既然我们已经认识到括号的顺序很重要,我们就需要继续处理两个以上括号同时出现的影响。当人们在一行中同时使用多个括号时,无论它们是否单独匹配对,我们如何计算出哪个特定的括号对与哪个特定的另一个括号对?
在只有两个括号的情况下,这很容易确定。但是一旦括号开始乘法(带或不带乘号),情况就会以指数级变得更加复杂。
我将首先用三组括号开始讨论,我喜欢称之为三组试验,因为毕竟它们是一组三组,有点像三和弦(Triand)。还因为我们必须尝试各种组合来弄清楚它们,因为向你解释这一切是一种考验。
在我说得更深入之前,还有一件事需要你知道。所有这些工作都是为了匹配括号,只有当您在双向隔离运行序列中时才算数。它们有点像长距离训练跑步,只是不同。如果你不知道它们是什么,别担心--你总是可以购买我的两部分课程,面向傻瓜的Unicode双向跑步,以及续集,面向傻瓜的Unicode双向隔离跑步序列。III:X10也是上升的。现在,我们只考虑到有人已经弄清楚了它们是什么,这里所有的示例都在里面
因此,让我们来看一些例子。我们将保持简单,从一开始就使用所有相同类型的括号--只使用方括号。
好的,那一行有三个左括号,但没有右括号。因此,不存在需要按正确顺序使用左括号和右括号的括号对。如何操作:
仍然有三个括号,但现在一个正在闭合,两个正在打开。然而,它们的顺序仍然错误,无法进行任何配对。但看看:
现在,前两个方括号按照正确的顺序开始和结束,因此我们可以计算出";[GUS]&34;包含一个方括号对,该对又包含文本";GUS&34;,包括空格。最后一个左方括号没有与之匹配的右方括号。类似地:
现在,第一个右括号没有要匹配的内容,但是";[Hank]";包含一个括号对,将文本";Hank";括起来。事情开始变得有趣的地方在于以下几点:
在本例中,";[Hank]";仍然包含括号对。这行的第一个开始括号与结束括号不匹配,因为在它之后有一个更接近较近的开始括号。所以较近的开场者胜出。等等,现在我把自己搞糊涂了!在任何情况下,[Gus[Hank];[Gus[Hank];]中的外方括号与括号对不匹配-只有内方括号匹配。
该示例与上一个类似,只是这一次括号对在";[Gus]&34;中,第二个结束括号与任何左括号都不匹配。
现在让我们在这里投一个曲线球--特别是花括号。这改变了事情,如果你只是挥杆离开,而不是盯着球,你会错误地表明事情是有效的:
该示例具有相同的开始-开始-结束模式,但是现在第二个左花括号(左大括号)不能再与结束括号匹配,因为它是不同类型的括号。因此,在本例中,外层对匹配,我们在";[GUS{Hank]";中找到一个括号对,包括文本";Gus{Hank";,包括左花括号和空格。
正如我们将在下一章中看到的,对花括号的影响是相当剧烈的,因为(一对方括号)方括号对准了它们所包含的花括号,并有效地扼杀了它。那个花括号不能与后来可能出现的任何其他花括号相媲美,因为它已经[可以说]封在了{棺材里]。
尽管如此,请记住,此行为不等同于方括号和花括号。事实并非如此,因为如果方括号天生就比大括号更结实,而且在争夺比赛时总是获胜。如果情况相反,大括号可能会把桌子翻过来,让括号结冰,而不是这样:
在本例中,在";{GUS[Hank}";]中有一个";方括号";对,将文本";GUS[Hank}";括起来,包括左方括号和空格。因此,这里的花括号将单一的左方括号与格斯和汉克放在一起。
因此,就查找括号对而言,没有一种类型的括号优先于任何其他类型。他们都是平等的。重要的是哪一个先到,然后其他的都按什么顺序出现在这条线上。
你们的作业是试着挖掘出更多带方括号和花括号的三合会。如果你发现任何我忘了的小问题,那都无关紧要。
好的,在最后一章中,我们将继续讨论UBA匹配括号对最困难的部分:如何匹配不同类型的多个括号的长序列。如果您现在还没有被淘汰出课程,您可能已经具备了加入Unicode括号俱乐部的条件。
不是的。Unicode方括号俱乐部的第一条规则是:UBA的匹配方括号对不是表达式求值。
嗯,是的。大多数人对多括号匹配原理的看法都来自于他们高中的代数课。记住这些方程式:
((a+b)*(b+9a))+((2a-1)*(2b+17))=-1。
您必须检查并计算所有表达式,并通过应用运算符形成其他表达式来组合内部表达式,等等。
是的,这些方程式不起作用,因为它们有所谓的表达式错误。如果使用圆括号(或矩阵的方括号等),它们必须平衡,否则表达式有语法错误,无法求值。
但是在Unicode括号俱乐部里,如果缺少平衡括号,哼!它只是更改了与行中的其他方括号匹配的方括号。缺少一根火柴也不是一个错误--它只是有趣而已。
所以,如果你已经准备好了方括号的BNF和LL-语法,并且想要开始忙于双向方括号的LALR解析策略,那么你可能是来错了班级了。(如果你已经准备好了方括号的BNF,并且已经准备好了LL语法,并且想要开始忙于双向方括号的LALR解析策略),那么你很可能找错了班级。也许Dummies的编译器就是您想要的。
相反,在Unicode支架俱乐部中,我们需要弄清楚如何处理:
我们需要找出匹配的括号对和不匹配的括号,但总是面带微笑地走出来。因为没有错误,每个人都是Unicode支架俱乐部的赢家!
那么我们如何找到匹配的括号对呢?您已经从第4章和前面的章节中获得了一些线索:
2.比赛的开场白必须是与闭幕式相同的托架。
3.如果不匹配的开局或更近的位置最终进入不同的匹配对,那么它将被从竞争中删除,并保持不匹配状态。
因此,让我们扩展支架试验的例子,进入全面的支架比赛。我们如何描述将导致一场好比赛的走势呢?
首先,总是从左边开始,有系统地向右边移动。这被称为比赛的逻辑顺序。(居住在中东的Unicode支架俱乐部的成员往往认为这总是从右开始,系统地向左移动,但他们仍然使用相同的逻辑顺序-只是当你看他们的比赛时看起来不同而已。可以把它看作是从拳击场的另一边观看的。)。
1.如果你在还没有找到与之相匹配的开场白之前就遇到了更近的人,那就丢弃它吧。这就是众所周知的伪装。
2.如果你遇到开场白,记住它。这些都是计分的。还要记住它是什么类型的开场白,并巧妙地在你遇到它的地方遇到了它。
4.如果你遇到的下一个开场白是更近的,检查它是否与你记忆中的某个开场白相匹配。你从最近遇到的开场白开始,然后回想起第一个相同类型的开场白。如果你找到了一个,恭喜你,你已经确定了一个开场白对。把它记下来保存起来。这就是所谓的组合。顺便说一句,如果你识别了一个括号对,但是当你回想起来的时候,你忽略了任何不同类型的括号,无论是开始还是结束,你现在可以忘记它们了。这些都被称为未命中。
5.然而,如果你遇到的下一个托架是另一个开场白,也要记住它,以及你是在哪里找到它的。这些人被称为守门员。
6.如果你遇到的下一个字符根本不是括号,就跳过它。这被称为花式步法。
7.现在检查一下你是否有系统地按照逻辑顺序一直走到最后。如果是这样的话,你就完成了,现在是得分的时候了。但是,如果你最后还没有完成,那么就回到第三步,然后再继续前行。继续比赛时,记住要不停地上下摆动和编织。
一旦比赛结束,就是得分的时候了。把你找到的所有组合都拿到计分台上,摆出来让评委检查。然后,评委将根据组合出现的位置对所有组合重新排序。您找到的组合的数量,按位置以升序整齐地重新排序,就构成了您的分数。祝贺您!
好的,让我们密切关注某场比赛的进展,看看所有的动作。竞争者是:
请注意,位置标有标签,从1开始,即每个字符。我们将按照逻辑顺序,系统地完成从1到9的所有过程。
位置7:找到一个更近的(终于!)[#34;]";。回想一下。
.