这应该是具有多个关键字的简单解释器的一部分,我将其制作成不同的类。该程序应该遍历ArrayList,将字符串标记化并将它们解析为KEYWORD +指令。我正在使用散列映射将所有这些关键字映射到具有类的接口,其中进行其余的处理。目前正在测试其中一个关键字类,但是当我尝试编译时,编译器会抛出“标识符预期”和“非法启动类型”消息。抛出所有错误消息的行是第18行。代码在哪里变得难以理解?我无法分辨,因为我之前从未使用过HashTable。谢谢你的帮助!
import java.util.*;
public class StringSplit
{
interface Directive //Map keywords to an interface
{
public void execute (String line);
}
abstract class endStatement implements Directive
{
public void execute(String line, HashMap DirectiveHash)
{
System.out.print("TPL finished OK [" + " x lines processed]");
System.exit(0);
}
}
private Map<String, Directive> DirectiveHash= new HashMap<String, Directive>();
DirectiveHash.put("END", new endStatement());
public static void main (String[]args)
{
List <String> myString= new ArrayList<String>();
myString.add(new String("# A TPL HELLO WORLD PROGRAM"));
myString.add(new String("STRING myString"));
myString.add(new String("INTEGER myInt"));
myString.add(new String("LET myString= \"HELLO WORLD\""));
myString.add(new String("PRINTLN myString"));
myString.add(new String("PRINTLN HELLO WORLD"));
myString.add(new String("END"));
for (String listString: myString)//iterate across arraylist
{
String[] line = listString.split("[\\s+]",2);
for(int i=0; i<line.length; i++)
{
System.out.println(line[i]);
Directive DirectiveHash=DirectiveHash.get(listString[0]);
DirectiveHash.execute(listString);
}
}
}
}
答案 0 :(得分:8)
要超越当前的编译器错误,您需要将DirectiveHash.put("END", new endStatement());
调用放在某种块中。如果您想在实例初始化程序中使用它,请尝试以下操作:
{ DirectiveHash.put(“END”,new endStatement()); }
答案 1 :(得分:2)
您的变量名称应以小写字符开头。 DirectiveHash使用变量名称,类/接口名称应以大写字母开头。
答案 2 :(得分:2)
您的DirectiveHash.put("END", new endStatement());
应采用某种方法。由于您的课程endStatement
是抽象的,因此无法使用new
答案 3 :(得分:1)
诚实地说有几个问题:
endStatement未正确实现Directive作为#execute方法签名 不匹配。
由于endStatement是抽象的(无法直接实例化),因此无法执行以下操作。
DirectiveHash.put("END", new endStatement());
这不能在块或方法之外完成。你通常使用一个构造函数:
DirectiveHash.put("END", new endStatement());
您实际上从未在main中初始化DirectiveHash。请注意,它是类的实例变量,main是静态方法。对于要使用DirectiveHash的main,它必须有一个StringSplit类的实例才能从中获取它。
以下行有点误导,因为您要分配和实例var名称与类名相同。合法但令人难以置信的阅读和一个非常糟糕的主意。实际上,在这种情况下,由于您没有在#main中实例化DirectoryHash,因此更麻烦。因此,ivar directoryHash(以备用混淆)被设置为指令,我们随后对“DirectiveHash = DirectiveHash.get(...)”的调用将被破坏,因为它意味着调用指令#get,这是不存在的。
Directive DirectiveHash=DirectiveHash.get(listString[0]);
以下行无效,因为“listString [0]”无效。您将listString声明为for()循环中的String - 而不是数组。
Directive DirectiveHash=DirectiveHash.get(listString[0]);
您的大小写需要更加严谨...使用类和接口的初始大写以及方法名称和变量的小写首字母。
嗯,这就像是编译器访谈中的一个。我看到有些人已经发布了这么抱歉。可能也错过了一些......
您可能需要阅读其中一些问题:
答案 4 :(得分:0)
您正在尝试实例化一个抽象类。无法使用new
运算符实例化抽象类。
也许您应该扩展endStatement
类(并将其重命名为EndStatement
)并为其提供具体实现