我目前正在分配创建一个带有 8 个关键字(不区分大小写)和 4 个算术运算符的基本解释器。这种语言的程序看起来像这样(实际上类似于 BASIC 的语法):
# (signals start of a comment line)
LET
INTEGER
STRING
PRINT
END
所以无论如何,我目前正在尝试标记要解析的文本行。我已经将所有文本行解析为 ArrayList 并对字符串进行了标记。我现在的问题是 StringTokenizer 提前标记了所有字符串(我使用空格作为分隔符),而我需要的是它找到我的关键字,这始终是代码行开头的第一个单词,并且某些问题使这种情况变得不可取;我认为使用 String.split() 也没有多大帮助。
我计划这样做的方式是让解释器找到我的第一个标记,然后通过 HashMap 从那里转到适当的类(参见我之前关于在此处为我的解释器使用 switch 语句的问题:Switch 或 if 语句在用 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);
}
}