私は現在、8つのキーワード(大文字と小文字を区別しない)と4つの算術演算子を使用して基本的なインタープリターを作成する割り当てに取り組んでいます。この言語のプログラムは次のようになります(実際にはBASICの構文に似ています)。
# (signals start of a comment line)
LET
INTEGER
STRING
PRINT
END
とにかく、私は現在、解析するテキストの行をトークン化しようとしています。私はすでにテキストのすべての行をArrayListに解析し、文字列をトークン化しました。私の現在の問題は、StringTokenizerがすべての文字列を事前にトークン化することです(区切り文字として空白を使用しています)。必要なのは、コード行の最初の単語であるキーワードを見つけることです。 、および特定の問題により、それは望ましくありません。String.split()を使用してもあまり役に立たないと思います。
私が計画していた方法は、インタプリタに最初のトークンを見つけてもらい、そこからHashMapを介して適切なクラスに移動することでした(ここで、インタプリタのswitchステートメントの使用に関する以前の質問を参照してください:Switchまたはifステートメントjavaでインタプリタを書く際に;他のメンバーから、キーワードトークンを削除して実行するためにマップを使用することが提案されました。特に変数を保持するために2番目の一時的なArrayListまたは配列を設定するのは良い考えですか?過度に複雑にする必要はありません。
提案を事前に感謝します。
public static void main (String[]args)
{
try
{
ArrayList<String> demo= new ArrayList <String>();
FileReader fr= new FileReader("hi.tpl");
BufferedReader reader= new BufferedReader(fr);
String line;
while ((line=reader.readLine()) !=null)//read file line by line
{
//Add to ArrayList
demo.add(line);
}
reader.close();
boolean checkEnd= demo.contains("END");//check if arraylist contains END statement
if(line=null && checkEnd== false)
{
System.out.println(" Unexpected end of file: no END statement");
System.exit(0);
}
ListIterator<String>arrayListIt=demo.listIterator();
while (arrayListIt.hasNext())
for (String file: demo)// begin interpreting the program file here
{
StringTokenizer st=new StringTokenizer(file);
while(st.hasMoreTokens())
{
int firstWord=file.indexOf();
String command = file;
if (firstSpace > 0)
{
command= file.substring(0, firstSpace);
}
TokenHandler tokens= tokens.get(command.toUpperCase());
if(tokens != null)
{
tokens.execute(file);
}
}