我目前正在进行一项任务,以创建一个包含8个关键字(不区分大小写)和4个算术运算符的基本解释器。在这门语言的程序会是这个样子(类似于BASIC的语法真的):用java编写一个解释器,使用多重阵列表或字符串排序器
# (signals start of a comment line)
LET
INTEGER
STRING
PRINT
END
所以无论如何,我目前正试图来标记要分析的文本行。我已经将所有文本行解析为一个ArrayList并标记了字符串。我现在的问题是,StringTokenizer预先标记所有的字符串(我使用空格作为分隔符),当我需要的是它找到我的关键字,它始终是代码行开头的第一个字,并且某些问题使得这不合要求;我不认为使用String.split()也会有很大的帮助。
我打算这样做的方法是让解释器找到我的第一个标记,然后从那里通过HashMap到相应的类(参考我以前关于在这里为我的解释器使用switch语句的问题: Switch or if statements in writing an interpreter in java;其他成员建议我使用Map)删除关键字标记并执行。设置第二个临时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);
}
}
目前尚不清楚你的问题是什么。 – 2012-01-10 18:31:29
@JBNizet我在问我是否应该考虑解析方法中的参数,或者解析所有的参数,并将其放入一个单独的ArrayList中,这个ArrayList包含了一个拥有脚本行的ArrayList。 – Luinithil 2012-01-10 18:49:39