RBParser消息节点和目标接收器和参数?

时间:2017-01-22 17:22:35

标签: pharo

尝试在Pharo中启动并运行一些旧代码。一些方法名称是不同的,但经过一些困难后,我设法找到有效的方法。

我正在解析我的代码,我想检查接收器或任何参数是否是一个符号,以便将它们与支持的替代方案相匹配。通过分析RBMessageNode s

,我已经设法对选择器做了这个
aNode selector == aSymbol ifTrue: [ aNode selector: replacementSymbol ].

如何对参数和接收者进行此操作?在某处有RBParser的综合指南吗?

1 个答案:

答案 0 :(得分:3)

通过直接操纵

假设您正在寻找这样的案例:

aSymbol message: aSymbol message: aSymbol

对于接收器,你应该这样做:

(aNode isMessage and: [
aNode receiver isVariable and: [ 
aNode receiver name = 'aSymbol' ]]) ifTrue: [
   "do your job here" ]

以下是有关如何使用#aSymbol替换#newSymbol参数的另一个示例:

messageNode arguments: (messageNode arguments collect: [ :arg |
    (arg isLiteralNode and: [ arg value = #aSymbol ])
        ifFalse: [ arg ]
        ifTrue: [ | newNode |
            newNode := #aNewSymbol asLiteralNode.
            arg replaceSourceWith: newNode.
            newNode ] ]).

methodClass compile: ast newSource

replaceSourceWith:确保只替换一个源,但是newSource实际返回一个新源,你还需要自己交换节点,这就是为什么我要进行收集参数并在需要的地方返回新的参数。

您可以在 Word菜单>中查看有关RBParser的帮助。帮助>帮助浏览器>重构框架

您也可以通过检查

来玩游戏
RBParser parseExpression: 'aSymbol message: aSymbol message: aSymbol'

并查看其内容

通过解析树转换

您可以使用模式代码来匹配和替换某些代码。例如,要更改perform:消息的符号参数,您可以执行以下操作:

ast := yourMethod parseTree.

rewriter := RBParseTreeRewriter new 
        replace: '`receiver perform: #aSymbol'
        with: '`receiver perform: #newSelector'.

(rewriter executeTree: ast) ifTrue: [
    yourMethod class compile: ast newSource ]

您可以在帮助主题 Word菜单&gt;中了解有关模式匹配语法的更多信息。帮助&gt;帮助浏览器&gt; <重构框架>重构引擎&gt; RBPatternParser ...... 。来自pharo目录的 MatchTool 可以极大地帮助您测试匹配表达式(它还有一个关于匹配语法的专用帮助主题),而 RewriteTool 可以帮助您预览你的代码将如何转换。