✨
【No.9】構文解析器のリファクタリング
クラスの分割
今回は、リファクタリングを実施します。
記事「【No.7】変数と代入文の追加」では、以下のような問題点を提示しました。
構文解析のクラスに、責務が集中してしまっています。
現時点では、以下の3つの責務が集まっています。
・構文解析
・実行
・名前表
ちょっとこれは対応が必要ですね。
Parserクラスに責務が集中していた点が問題でした。
実装
Parserクラスから、実行に関連するメンバをExecutorクラスに移動させました。
また、Parserクラスの構文解析を実行するメソッドが「conduct」という何をしているのかよく分からない名前だったので、doParseという名前に変更しました。
Parser.java
package parser;
import lexer.Lexer;
public class Parser {
//構文解析を行う
public AstNode doParse(Lexer lexer) {
AstNode root = new ProgramNode().parse(lexer);
return root;
}
}
Executer.java
package parser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Executer {
//名前表
private Map<String,Integer> nameTable = new HashMap<>();
//ASTをたどって実行する
public List<String> doEval(AstNode root){
List<String> list = new ArrayList<>();
root.eval(list,nameTable);
return list;
}
//名前表の確認用
public Map<String,Integer> getNameTable() {
return nameTable;
}
}
課題
まだまだ改善すべき点は多いので、当分はリファクタがメインになります。
Discussion