【No.9】構文解析器のリファクタリング

2023/02/23に公開

クラスの分割

今回は、リファクタリングを実施します。

記事「【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