SmaCC 指南

这是一个用于演示一些SmaCC(Smalltalk编译器的编译器)的简要指南。在这个例子中,我们会逐步开发一个简易的计算器。

如果你已经做过这种东西,你可以先 载入代码 。你载入了代码之后,你需要打开SmaCC解释器生成器。在VisualWorks 和 VisualAge中,它在Tools菜单下。Dolphin的在一个额外的工具目录中。它会打开一个类似下面的窗口:

SmaCC Window

我们第一个计算器相对比较简单。它只要能读取两个数字并把它们相加。开始之前,我们首先要告诉扫描程序如何辨认一个数字。数字由一个或多个数字打头,后面可能还有一个小数点加上0或者更多的数字。扫描程序对这个标记的定义是:

把这行代码输入界面上的scanner标签页中。让我们逐个看每一个部分:

<number>

指出记号的名字。在<>中的名称必须是合法的Smalltalk变量名。

:

分隔记号名称和记号定义。

[0-9]

匹配任何一个在’0’到’9’(一个数字)范围中的字符。

+

匹配前面的表达式一次或多次。在这种情况下,我们要匹配一个或多个数字。

( … )

标示子表达式组。

\.

匹配 ‘.’ 字符(. 在正则表达式中有特殊的含义,使用 \ 来转义)。

*

匹配前一个表达式零次或多次。

?

匹配前面的表达式零次或一次。(也就是,前面表达式是可选的)。

;

终止一个记号说明。

我们不想去关心我们语言中的空白符,所以我们需要定义什么是空白符并且忽略它,输入下面的记号说明:

\s 会匹配任何空白字符(空格、制表符、换行、回车等等)。然后我们怎么告诉扫描程序去忽略它呢?
如果你看一下SmaCCScanner类,你会发现一个叫做’whitespace’的方法。如果一个扫描程序有一个方法的名称和某个标记一样,那么一旦扫描程序匹配了这类标记就会调用这个方法。正如你所见,whitespace方法会吃掉空白符。同样还有一个’comment’方法会作类似的处理。

说到我们的语法,现在让我们来定义它吧。在Parser表格中输入以下语法说明:

这基本上指出了一个表达式可以是一个数字或者是另一个表达式加上一个数字。

我们现在应该可以编译一个分析器了。切换到Compile标签页。你要输入扫描器和分析器的类的名称。这里我们相应使用CalculatorScanner 和CalculatorParser。当类名输完之后,我们就准备编译分析器了。点击 ‘Compile LARLR(1)’
按钮(你应该总是点这个按钮除非你知道你要做什么。一般来说,他会生成比另一个选项更小的分析器)。这时就会生成新的CalculatorScanner和CalculatorParser的Smalltalk类同时会编译这两个类中的一些方法。所有的SmaCC编译出来的方法会按照”generated-*”的格式。你不可以更改这些方法因为每次你重新编译他们都会被覆盖。

不管SmaCC何时创建新类,这些类都会被放到默认的应用程序/包中。如果你使用的是VisualAge,你要确保默认应用程序是开放的版本而且SmaCCRuntion应用程序已经安装(prereq)。

如果你已经生成了扫描器和分析器类,你可以通过类名旁边的”…”按钮来载入他们的定义。如果在出现的对话框中你回答”Yes”,那么在Scanner/Parser标签页中的文本就会被替换为上一次编译过的定义(假设”Generate definition comments”在上一次编译中被选中了)。

现在我们要测试我们的分析器了。进入“test”面板,输入“ 3 + 4”(不要加双引号),并且点击“parse”按钮;你会看到分析器正确分析了它。如果你点击“Parse and Inspect”你会看到一个检视器(inspector),里面有一个包含了被解析的记号的顺序集合(OrderedCollection)。这是因为我们没有指明当分析器在解析的时候要怎么处理记号。你也可以是如一个不正确的内容。例如尝试解析“3 + + 4”或者“3 + a”。应该会出现一个错误信息。

现在我们要定义当我们分析我们的表达式的时候要产生的动作。当前的情况是,我们的分析器仅仅验证表达式是一些相加的数字。一般来说你要创建一些结果来表示你已经解析了什么内容(比如,一个棵分析树)。然而,在这个情况下,我们不关心结构,我们只关心结果(表达式的值)。在我们的例子中,你需要把语法定义改成如下:

括号中的文本是Smalltalk代码,当应用规则的时候,就会执行这个代码。有一个数字的字符串会被替换成相应的解析节点。在第一个Expression的规则中,’1’会被替换成匹配Expression的ParseNode同时’3’会被替换成匹配Number的ParseNode。在规则中的第二个东西是’+’记号。因为我们已经知道它是什么了,所以我们对他不感兴趣。编译新的分析器。现在当你从Test面板中执行’Parse and Inspect’时,你应该看到这个结果:7。

前面的代码有一个问题是如果你需要更改一个规则,你可能也要跟着修改规则内的代码。例如,假设你你在规则的开头添加了一个新的记号,那么你就要更改所有在Smalltalk代码中的引用了。我们可以通过使用命名表达式来减少这种问题。在规则的每个部分后面,我们可以指明它的名称。名称是通过单引号来标明的,它同样必须是一个合法的Smalltalk变量名。象下面这个:

它和前面解析的语言的结果是一样的,但它同时让你更容易维护的你分析器。让我们现在扩展我们的语言并加入减法功能。这里是新的语法:

你编译了这个代码之后,’3 + 4 – 2’就会返回’5’了。下面,再让我们加入乘法和减法:

这时我们遇到一个问题.如果你计算” 2 + 3 * 4“,最后的结果将是 20。这个问题是因为在标准的数学中,乘法比加法有更高的优先级。我们的语法是严格按照从左到右的方式运算的。这个问题一般的解决方法是定义加法的非终结符来强制计算的顺序。这个解决方法的语法类似:

这时候如果你编译这个语法,你会看到” 2 + 3 * 4 “的计算结果是14,正如我们所期望的那样。现在,正如你可以想象的,当优先级规则的数量增加时,语法也越来越复杂(例如,C语言)。我们可以使用歧义语法和优先级规则来简化这种情况。这里有一段使用优先级来限制计算顺序的一段语法:

注意我们更改了语法所以操作符两边都是Expression。我们在语法顶部添加的两行表示“+”和“-”是从左至右运算的而且优先级相同,同时他们的优先级比“*”和“/”低。类似的,第二行表示“*”和“/”有同样的优先级。这个形式的语法通常更加直观,特别是当有很多优先级要处理的时候。我们再来一个例子,现在加入指数运算和括号:

当你编译了这个语法之后,你就可以正确计算” 3 + 4 * 5 ^ 2 ^ 2“得到2503了。由于这个指数操作是右结合的,所以这个表达式是象这样计算的3 + (4 * (5 ^ (2 ^ 2)))。我们也可以计算带括号的表达式。例如,计算 ” (3 + 4) * (5 – 2) ^ 3 “将得到189。

jMemorize 介绍

jMemorize是一个 Java 应用程序,可以使用著名的Leither系统来管理你的抽认卡,让记忆事情不仅有效而且有趣。它可以管理你的整个学习过程和特点分类、统计和一个优雅的外观。

Leitner 原理

Wikipedia的文章这样定义Flashcard (抽认卡):

一个抽认卡是一小块纸片,在学校里用来作辅助教学(主要是英语国家)。抽认卡可以用来记录词汇、历史事件时间、公式等等。使用抽认卡的目的主要是帮助[[记忆]]。你在每个卡片上写下一个问题(同时在背面记下答案),用它们来测试自己,并根据你的测试、学习结果把它们进行排序、分组。

这种策略使得学习更有选择性,也是就:在一组的卡片越难,你就越要花时间复习这一组。于是,你就能节省很多学习时间。

这个方法是由德国心理学家 Sebastian Leitner 在 19世纪70年代提出的。 Pimsleur 语言课也是基于类似的想法。

这个基本思路是根据它们对你的难易程度把卡片划分成不同的级别。这是通过你尝试回答一些重复问题来完成的。每次你了解的一个卡片的正确回答,它就会放到下一个较高的卡片级别中。如果某个卡片你没有回答出来,它就会被放回到开始的级别。

这个系统是和时间表结合在一起的。已经学习过的卡片,会在一个特定的失效期过后,重新被确认为要学习。级别越高,失效时间就越长。例如一个卡片第一
次成功检测过之后,会被安排在一天之后再次学习,当这个卡片连续三次都回答正确了之后,系统会在一周内都认为学过了。只要这个卡片被认为是学过了,它就不
会在当前学习阶段出现。

总之,这个系统将管理你的个人学习过程并让你关注于学习本身,同时它会自动决定哪个事物现在要再学习,尽可能让这些事情从你的时间中抽出来。

特性

  • 新建、编辑、删除和重置卡片。
  • 通过建立卡片分类来安排卡片。
  • 你当前的学习情况的可视化演示。
  • 可方便地自定义你的学习会话设置。这包括以下功能:
    • 选择要学习的分类。
    • 选择只学习新的卡片、过期卡片和所有卡片。
    • 选择卡片/时间的限制。
    • 选择你是否想以普通模式(顺序)学习还是随机模式。
    • 选择预设的时间表或自己创建自定义时间表。
  • 可以搜索你的卡片
  • 还有很多很多

许可证

本软件由 Riad Djemili ( riad.de) 开发以 GPL license.发布。这表示 jMemorize 是自由软件,不仅可以自由分发二进制代码,同时还提供完整的源代码。

使用XPWeb应用极限编程(隐喻)

隐喻

XP隐喻 (metaphor)必须能帮助你用可以理解的语言描述你的系统。

为了达到这个目的,我们可以在XP< /span>Web的“隐喻”一节中列出所有的隐喻术语。这些术语由一个名字/标题和他的解释组成。

“超描述”

通常作为“超描述”的东西现在是一个称为“文本模式”的一个大的功能特性。
如果在隐喻中定义了一个词,把{}放在词的两边,就可以把它变成“超词”……
注意你可以用词的复数形式(“words”可以找到“word”定义)。

事实上,搜索定义有三个级别:

  1. 搜索词的实际定义
  2. 如果没有结果,查找包含该词的那个词的定义。
  3. 最后,查找词的定义中包含该词的。

要获得更多的关于模式和如何修改的信息,看这里.

例子

参照只包含两个词的隐喻的例子,同时你注意第一个“连接”到了第二个。

尝试点击“senses”连接在第一个词的描述中,应该会出现一个弹出窗口连接到第二个词……

同时,通过点击“修改”,注意这个连接只会基于这个词的复数形式(用括号括出)。

使用XPWeb应用极限编程(安装)

ShiningRay @ NirvanaStudio

安装

安装 XP Web

  • 确保你已经拥有mysql(或者其他数据库,请在配置中指定)和一个可以运行PHP4或PHP5脚本的Web服务器(和相应的PHP库!如:如果要连接postgresql数据库必须启用php_pgsql扩展)。
  • [ 下载 ] the latest version of the tool (XPWeb.tgz 或者 XPWeb.zip).
  • [ 解压 ] (unzip 或者 ungzip 和 untar) 文档.
  • 把目录中的XPWeb 目录放到那个可以运行PHP和数据库的网络服务器的目录中。
  • 你也许想在配置文件里[ 配置 ] 一些参数,例如数据库名称,登录名和密码 ,
    注意:配置十分重要,包括负载因子和其他参数,必须在初始化/更新数据库之前完成……

    You should do this in a [ 本地配置]

    你只要新建一个 [ Config_local.inc.php ] 文件,并把它放到XPWeb的根目录下 -和Config.inc.php同一位置- 并且将你要“本地化”的设置从 Config.inc.php 中复制过来。

    你在本地进行的设置会覆盖默认的设置,那些没有放在本地文件中的设置就会设为默认。

    既然这样当升级到新的XPWeb的时候,可能会有一些新的默认设置,但不用担心你已经存在的本地设置(分发包里面不包含Config_local.inc.php文件,所以可以保证你在升级的时候原来的设置不会被覆盖……)
    这里有一个完整的Config_local.inc.php 文件的例子:

    <?php

    defineOnce(“XP_REPORT_TEMP_PATH”,”../../temp”);

    defineOnce(“XP_DEFAULT_LANGUAGE”,”fr”);

    defineOnce(“XP_DB_PASS”,”myPass”);

    ?>

    记住你无需复制所有的设置,只需要那些你要对默认设置进行改变的那些值……

  • 使用浏览器访问 [ index.php ] 页面,这时页面应该给出一个连接来新建或者初始化数据库。

升级 XP Web

任何XPWeb 的升级都会保证你所有的数据安全,当然也不会改变你使用 XPWeb 的习惯;-)

  • 如何创建一个本地的配置文件已经在上面解释过了。如果你已经有了一个文件, [ keep it safe ].
  • 按照一般安装的步骤替换你的XPWeb 目录(你不会丢失任何项目数据)。
  • 只要简单的 复制 你的 Config_local.inc.php文件到 XPWeb 根目录 (XPWeb/).
  • 浏览[ XPWeb/index.php ] 并按照他的指示来更新数据库。
    注意: 在进行数据库初始化或更新之前必须有一个正确的配置文件……
  • 好了,你肯定跃跃欲试了!
  • XPWeb 2.2之前版本进行升级的注意点

    XPWeb 直到2.2,任务是用“完成百分率”表示的。从2.2到以后,你要使用“done”和“todo”字段来替代。数据库的升级会删除“actual completion”(实际完成)字段并且生成相应的“done”和“todo”字段。确保你想要直接跳到当前版本。
    你也许应该考虑在升级之前备份一下你的数据库……

问题?

  • 你的Web服务器的配置文件应该说明以“.php”为扩展名的文件是PHP代码文件并且 “<?php” 和 “?>” 之间的代码是 php (这时通常的配置).
  • 要有一个正在运行的数据库服务器同时你必须在Config_local.inc.php中指定正确的 [ 数据库 用户/密码] 参数。
  • 如果你在身分验证上遇到了麻烦,你可以检查PHP Session 配置。你需要能在Web服务器上能处理Session文件。
    你也可以改变Config_local.inc.php 中的XP_SESSION_PATH 参数
  • 不能管理选择当前的项目或者在本地网络上登录 XPWeb ?
    这里有一个对于IE的 已知的bug你可能感兴趣(服务器名不能包含点)。
  • 请在你想问我们关于PHP的配置的问题前检查一下 php.net 手册……
  • 一般来说,关于[ 使用 ] 而不是 [ 安装 ] XPWeb的帮助, 请记得参考内部的帮助文件。
  • 请访问Sourceforge.net上的在线论坛来获得更多的帮助。

相关连接

  • XPWeb网站
  • XP Web 在Sourceforge.net上的论坛


  • Wampserver PHP/MySql for Windows
  • 熵.ch PHP5 for Mac OS X
  • PHP 安装
  • MySql 安装
  • CVSWeb
  • xUnit 测试框架
  • XProgramming.com
  • 其他 XP 软件
  • 极限编程Wiki

使用XPWeb应用极限编程(文档)

Doc

文档部分包括四个很相似的子部分:

  • 模型(modeling) 与模型相关的连接
  • Doc文档 其他文档文件
  • Javadoc Javadocs… 够明确了吧?
  • 目录(Directories) 你希望被显示以便直接显示并访问其中的文件而不需要添加指定文档。

这些连接都在项目部分中定义.

注意如果项目的这些部分中只有一个连接被定义了,点击“Doc”标签会默认直接打开它。
再次点击“Doc”标签会把你带回“通常”的文档部分,显示所有的子部分。

打开 / 下载文档 –

所有这些文档都要遵守同一个原则:

  • 文档会在一个框架页中打开,同时如果Web浏览器支持它的格式,它就会在页面中打开。
  • 如果你知道浏览器不支持文档的格式,最好在新的窗口中打开(同时它可能会弹出一个对话框让你下载这个文档)

目录

目录十分特殊。

这是一种无需一个个手工添加文档就可以访问文档的方法。
层次结构可以通过点击子目录来打开。

注意:配置目录的时候要小心,因为如果层次很复杂的话页面显示会要用很长时间。
只能够选择本地的目录。

这里有一个View目录的例子 (一些按钮被禁止了).