squeak(Smalltalk) 在字符串中搜索正则表达式

squeak(Smalltalk) search regex in string

我正在尝试编写一个方法 'compile' 来获取一个字符串和一个集合,并查看该字符串是否符合条件。 方法签名是:

compile: stringCode where: argTypeCollection

使用示例(假设C是class):

C compile: 
'first: i second: any third: n
| local |
   local := i + n.
  ^(local*local)'
where: #(Integer nil Number).

该方法应该做的第一件事是通过检查参数数量是否正确来分析字符串,我想用正则表达式来这样做。 我试图寻找正则表达式使用解释 here and here 但唯一的例子是文件,我没有成功扫描字符串并计算 [a-zA-z][a-zA-Z0-9] 的匹配项*: 同理

任何在 squeak 中对字符串使用正则表达式的示例都会有所帮助。

在分析 Smalltalk 源代码时,最好的选择是使用与 Smalltalk 编译器用于解析、编译和评估方法以及代码片段的完全相同的 objects。换句话说,拥有所有可供您使用的编译工具,使用正则表达式来完成这些类型的任务意义不大。

例如,您可以使用 Parser 像这样

分析方法的 header(即源代码中定义选择器和形式参数的部分)
Parser new parse: aString class: aClass

其中 aString 是方法的源代码,aClass 是目标 class,即该方法对其有意义的 class。

在您的示例中,class 是 C。但是请注意,当源代码不包含对 ivars 的引用(或就此而言 class 或共享变量)时,参数 aClass 变得无关紧要,可以替换为 Object.

parse:class:消息的结果,如果解析成功,将是一个抽象解析树(a.k.a.AST),其节点将带来更多对进一步分析有用的信息。如果解析失败,您将获得解析错误 object 的访问权限,这将让您确定为什么代码是 non-conformant 与 Smalltalk 语法。如您所见,您将拥有反思所分析源代码所需的一切。