/*
* Copyright (C) 2013-2016 たんらる
*/
package fourthline.mmlTools.core;
import java.util.Iterator;
/**
* MML命令の分割
* @author たんらる
*/
public final class MMLTokenizer implements Iterator<String> {
private static final String noteString = "abcdefgABCDEFGnNrR";
private static final String tokenString = noteString + "tToOlLvV<>&";
private final String mml_src;
int startIndex = 0;
int endIndex = 0;
public MMLTokenizer(String src) {
mml_src = src;
}
@Override
public boolean hasNext() {
if (endIndex < mml_src.length())
return true;
return false;
}
@Override
public String next() {
startIndex = endIndex;
endIndex = searchToken(endIndex+1);
return mml_src.substring(startIndex, endIndex);
}
@Override
public void remove() {
startIndex = 0;
endIndex = 0;
}
/**
* 解析位置の取得
* @return 解析位置
*/
public int[] getIndex() {
return new int[] { startIndex, endIndex };
}
public static boolean isToken(char ch) {
if (tokenString.indexOf(ch) < 0)
return false;
return true;
}
public static boolean isNote(char ch) {
if (noteString.indexOf(ch) < 0)
return false;
return true;
}
public static String noteName(String token) {
String noteName = ""+token.charAt(0);
if (token.length() > 1) {
char note2 = token.charAt(1);
if ( (note2 == '+') || (note2 == '-') || (note2 == '#') )
noteName += note2;
}
return noteName;
}
public static String[] noteNames(String token) {
String noteName = noteName(token);
String noteLength = token.substring(noteName.length());
return new String[] { noteName, noteLength };
}
public int searchToken(int startIndex) {
int length = mml_src.length();
int index;
for (index = startIndex; index < length; index++) {
char ch = mml_src.charAt(index);
if (isToken(ch))
break;
}
return index;
}
public int backSearchToken(int startIndex) {
int index;
for (index = startIndex-1; index >=0 ; index--) {
char ch = mml_src.charAt(index);
if (isToken(ch))
break;
}
return index;
}
}