dram.me

程序设计语言语法图(Railroad Diagram)

所谓“一图胜千言”,在适当的时候,图形化的表述更能快速、简洁地传达信息。

在Smalltalk蓝皮书的末尾,附有针对Smalltalk语法的说明,使用的是railroad diagram这种图形化的表述。

细想之下,Smalltalk没有使用文本化的形式(例如EBNF)而是采用图形化是合乎情理的。因为Smalltalk语言是为让更多非专业人员充分利用计算机的资源而设计,在各个层面上需要做到尽量地平易。

本文主要介绍生成这类语法图的详细流程,基于SQLite项目使用的基于TCL/TK的工具。 该工具脚本采用PS作为中间数据文件,再经由ImageMagick将PS文件转化为PNG图片(此操作ImageMagick需要依赖GhostScritpt完成)。

以下详细说明该脚本的用法。

获取脚本

SQLite项目使用Fossil处理代码版本管理,语法图的脚本存放在docsrc代码库中。由于没有找到直接下载单个文件的方法,这里通过fossil获取其全部代码。

fossil clone http://www.sqlite.org/cgi/docsrc sqlite-doc.fossil
mkdir sqlite-doc && cd sqlite-doc
fossil open ../sqlite-doc.fossil

生成语法图的脚本路径为art/syntax/bubble-generator.tcl

编辑语法图数据

数据描述文件用于指定需要绘制的语法图的所需信息。具体的语法可参考art/syntax/bubble-generator-data.tcl文件。可以在此文件基础上直接修改和添加新语法,例如将如下示例代码添加到文件的all_graphs块内:

digit {
  or
    {line 0}
    {line 1}
    {line 2}
    {line 3}
    {line 4}
    {line 5}
    {line 6}
    {line 7}
    {line 8}
    {line 9}
}

digits {
  loop digit
}

number {
  line {opt digits r} {opt -} digits {opt . digits} {opt e {opt -} digits}
}

以上示例代码绘制了和蓝皮书中相同的对于Smalltalk数值常量语法的描述。

生成语法图

通过wish命令运行bubble-generator.tcl,可以看到在图形化菜单中包括了上例中新添加的digitdigitsnumber项,点击即可生成图片。

如下图所示为其中number的最终效果:

Squeak中文支持

一个软件系统对于国际化语言的支持体现在多个方面,展开来讲,可以包含以下内容:

  1. 显示支持(主要是字体,也包括排版等);

  2. 键盘输入支持(可以内置输入法,或者对接操作系统的输入模块);

  3. 文件写入和读取支持;

  4. 剪贴板支持;

  5. 翻译支持(有系统级国际化和本地化支持)。

在新近版本(v5.1)中,Squeak对于中文的支持已经非常完善。遗留的问题包括:

  1. 默认不包含中文字体,所有中文字符显示为(?);

  2. 在Unix X11环境中,无法使用系统输入法(XIM)。

本文之后的内容,主要说明如何解决这两个问题。

中文字体

当前可供选择的开源的适合作为屏幕显示使用的中文字体,如Droid Sans Fallback,Source Han Sans & Noto,WenQuanYi ZenHei等。但由于Squeak只支持TTF和TTC格式字体,不支持OTF和OTC,所以部分字体被排除在外。

当前选择的是Fandol。Fandol默认只提供OTF字体,但可以在Fandol的GitHub项目中找到PS格式的字体文件,通过FontForge可以转化为TTF字体。

在字体转化时,注意两点:

  1. 如果提示需要Adobe-GB1-5.cidmap文件,可以在FontForge的安装目录找到;

  2. Fandol中多个字体的空白符宽度存在问题,可以在FontForge中设置(在空白符点右键,选择“Set Width”,设置宽度为333)。

在完成字体转化之后,可以通过在Workspace中运行以下语句设置字体:

TTCFont newTextStyleFromTTFile: '../../fandol-fonts/FandolHei-Regular/FandolHei-Regular.ttf'.
TTCFont newTextStyleFromTTFile: '../../fandol-fonts/FandolFang-Regular/FandolFang-Regular.ttf'.
TTCFont newTextStyleFromTTFile: '../../fandol-fonts/FandolHei-Bold/FandolHei-Bold.ttf'.

UserInterfaceTheme current
	set: #standardButtonFont to: ((TextStyle named: 'FandolFang-Regular') fontOfPointSize: 15);
	set: #standardCodeFont to: ((TextStyle named: 'FandolFang-Regular') fontOfPointSize: 24);
	set: #standardListFont to: ((TextStyle named: 'FandolHei-Regular') fontOfPointSize: 15);
	set: #standardMenuFont to: ((TextStyle named: 'FandolHei-Regular') fontOfPointSize: 15);
	set: #standardSystemFont to: ((TextStyle named: 'FandolHei-Regular') fontOfPointSize: 15);
	set: #windowTitleFont to: ((TextStyle named: 'FandolHei-Bold') fontOfPointSize: 15);
apply.

输入支持

在UNIX X11环境中,Squeak依赖XIM实现国际化字符输入。但默认情况并没有开启该功能,需要手动设置参数,详情可阅读邮件列表中的讨论

具体设置方法为:更改squeak.sh文件中最后的exec ...行,加入-compositioninput参数,另外如果系统尚未设置XMODIFIERS环境变量,可在此指定。以下为一示例:

XMODIFIERS=@im=fcitx exec "${VM}" -compositioninput "${IMAGE}"

其他

另外还有其他一些细碎的问题,试列举如下:

  1. FileList工具默认以Latin1TextConverter编码读取文件,而不是支持中文的UTF-8编码,该问题可以在FileList>>defaultEncoderFor:中调整为 UTF8TextConverter解决;

  2. 文本编辑器在处理自动折行时依据空格处理,这不适用于中文的场景,该问题的解决方案有待分析;

  3. X11环境包含两个剪贴板,Squeak不支持选择剪贴板,该问题有待进一步分析。

自定义Pelican标记语言支持(SAM插件)

Pelican默认支持的标记语言种类不多(reStructuredText和Markdown),但它提供了简洁的插件机制,可以方便添加新的标记语言支持。

在介绍如果添加插件之前,先来分析下Pelican中对标记语言源文件处理的基本工作流程:

  1. 遍历源文件目录,根据扩展名调用不同的解析器(reader);

  2. 从解析器中获得页面元数据(标题、日期等)和内容信息;

可以据此推导出标记语言插件需要具备的功能:

具体来说,Pelican的插件通过继承pelican.readers.BaseReader类来实现。其中定义有file_extensions属性,实现read方法。read方法返回一个元组,包含页面内容和元数据。

插件的注册是通过在插件文件中定义register函数实现。该函数在Pelican解析器初始化中挂载钩子,钩子的功能是向Pelican添加以上实现的新标记语言的解析类。

详细的内容,可以参考Pelican的Plugins文档以及这里的SAM插件

0~1岁幼儿阅读的行为特点

初为人父人母的家长,在拿着各类“宝宝的第一本书”和孩子分享阅读时,都会抱着很大的期待。但结果可能不尽如人意,孩子或是抓着书咬、拿着书撕,或是挣脱怀抱去找玩具,感觉对于阅读全然没有兴趣。

如果能够预先对幼儿在阅读时的行为特点做一些了解的话,家长可以有一定的心理准备,从而能够获得更理想的初次亲子共读体验。

以下要介绍的是由 Linda Leonard Lamme 和 Athol B. Packer 做的一项调查研究 [1] 。Lamme 和 Packer 跟踪调查了 13 对母亲和幼儿,记录了他们的阅读过程。幼儿都未满一周岁,在开始调查时为 3~8½ 个月大,结束时为 7~12½ 月。

两位学者从视觉、触觉、语言以及情感等方面对幼儿在阅读时的行为进行归纳整理,发现幼儿在阅读中的行为是一个不断发展的过程,具体可以分为 5 个阶段。

一、0~3 月 接受性阅读
这一阶段,幼儿很少盯着书看,即使看也可能和家长所读的东西不相关。他们对于阅读的反应比较简单,要么乐意坐着听,要么不乐意。在这一阶段家长要特别留意孩子的反应。
二、3~6 月 对书产生兴趣
幼儿开始对书产生兴趣,在阅读中他们会有刮、拍、点、擦、抓等动作。不过兴趣并不持久,是随意性的。
三、6~9 月 积极参与
幼儿开始更多地参与到阅读中,从这一时期开始,幼儿开始出现语言上的回应。而肢体动作的回应也会更多。如果幼儿从出生就开始阅读的话,这时就开始有明显的阅读喜好和阅读习惯了。
四、9~12 月 主动阅读
幼儿在这一时期更加主动地参与到阅读中,他们知道书的正反面,可以根据家长所说内容找出图片位置,在家长讲完一页后主动去翻书。对于熟悉的故事,他们会以微笑、手势的方式来预测内容。
五、12~15 月 共同阅读
这一时期,在阅读熟悉的书时,他们会开始和家长一起阅读,而不只是听。他们喜欢在书上指指点点等待大人的反应,喜欢认识事物的名称、拟声词汇、重复的旋律等。这一时期的幼儿已经能够自由地移动,他们不喜欢长时间地坐着,所以除了睡前或者午休前外,其他时间的阅读持续时间都会比较短。

另外,大量因素都会影响幼儿对于阅读的反应,例如:对书的熟悉程度、时间段、阅读的地点、幼儿的精力、书的类型、书的大小、阅读经验的多寡、和谁一起共读等。

总的来说,幼儿注意力平均的持续时间只有 3 分钟,所以在和幼儿一起共读时,要特别注意孩子的反应,而不能把注意力全部集中的书上。

[1]Linda Leonard Lamme and Athol B. Packer “Bookreading Behaviors of Infants” Reading Teacher, Vol. 39, No. 6 (Feb., 1986) pp. 504-506

《幸福的种子》和有声读物

昨天晚上拿到了《幸福的种子》,这本书主要是指导父母如何选择和使用图画书,作者是有“日本图画书之父”之称的松居直。

这些天一直在了解、整理图画书方面的资料,对于这样一本久负盛名的书,拿到手时自然是迫不及待地翻看了。看了几页,就给我很多触动,或者可以用“震撼”这个词。

近一两年手机和平板应用的火爆催生了很多的儿童应用。其中就包括一些有声读物,比如网易的 宝贝听童话 还有蘑菇娃的 宝宝故事 。在初了解这些应用时,心里有种奇怪的感觉,觉得哪里有一些不对,觉得这样的应用或许并不是孩子需要的,但又说不太清。

而对于这个疑问,我在松居直的《幸福的种子》中找到了答案。

应该肯定的是,语言在儿童早期教育中的重要作用。正如松居直开篇所说:

要增加幼儿的词汇量,培养幼儿的语言能力,最重要的就是让他们在成长的过程中听到丰富的语汇。事实上,建立幼儿阅读能力的基础,是从耳朵不断累积词汇开始,而不是让幼儿提早识字、看书。

但另一个重要的问题是,这个“声音”、“语言”来自哪里?是电视、电脑、手机,还是来自于孩子所亲近的人?或许下面这段话可以说明:

幼儿最大的财富是健康、亲情与语言。如果有人经常紧紧地拥抱他,用温柔的声音对他说话,孩子就能通过肌肤的接触和语言的交流,感受到亲情。幼儿充分体验到这种感情,心灵会一点儿一点儿充实起来,成为一个内心丰盈的人。这其中又以语言的影响最为重要。

一个从机器中发出的声音,即使再美妙,发音再标准,也不及从母亲口中说出的话语来得温暖、亲切。

现在,我甚至偏执地认为,每一个做儿童应用的人,都应该读一读这本书。应用的定位应该是辅助和增进亲子间的交流,而不能妄图替代父亲、母亲的角色。

最后,再附上松居直在前言《爱的语言》中的最后一段话:

亲子之间丰富的语言交流,是一个家庭最大的财富。

← older posts