1日に二本出してますね
更新頻度が極端...
今回はScannerを作ります。Lexerで分割したやつをmapに直すやつですね。
名前Scannerで合ってるかわからない
そんじゃ早速。
Scanner.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class Scanner {
public Map<String, Object> Scan(ArrayList<String> list){
String functionName = list.get(0);
ArrayList<Object> args = new ArrayList<>();
boolean isString = false;
for(String element : list){
if(element.length() == 1){
if(Lexer.getType((element.toCharArray()[0])).equals(Type.bracket)){
continue;
}
if(Lexer.getType((element.toCharArray()[0])).equals(Type.string)){
isString = !isString;
continue;
}
if(Lexer.getType((element.toCharArray()[0])).equals(Type.split)){
continue;
}
}
if(isString){
args.add(element);
}else if(checkString(element)){
args.add(Integer.parseInt(element));
}
}
Map<String,Object> obj = new HashMap<>();
obj.put("function", functionName);
obj.put("args", args);
return obj;
}
// https://uha-blog.com/java/mojiretsu-suti-hantei/
// 引数で受け取った文字列が数値かどうか正規表現でチェックするメソッド
public static boolean checkString(String text) {
boolean res = true;
Pattern pattern = Pattern.compile("^[0-9]+$|-[0-9]+$");
res = pattern.matcher(text).matches();
return res;
}
}
解説をば。
関数[checkString]は文字列が数字かどうか判定するためにここからお借りしました。
内容をまとめると正規表現を使ってます。
Scan関数本体へ。
これはLexer作成の回で作ったやつを引数に取る想定で利用しています。
関数の名前が最初に来ると思いこんで(危険)、list.get(0)してます。
引数は()や" '、, ;を省いてます。
文字列かどうかも判定してます。
Listの型がObjectなのはどんな引数が入るか予測できないため。
使うときにはキャストしてください。
そんで返すMapに結果を打ち込んでreturnします。
最後に
なんか結構雑になりましたね。
まぁ1日二本も出してるからしかたない(自己責任)
そんじゃまた。
またいつか記事投稿強化月間でもしたいですね。