2012-01-07 38 views
0

当前任务需要我编写一个程序来读取带有非常小的基本编程语言(行为有点像FORTRAN)的指令的文件并执行这些指令。基本上它是我猜测的语言的简单解释器。它是完全线性的,所有的语句都是按顺序定义的,它只有字符串和整数变量。有8个关键字和4个算术运算符,我需要找到并定义它们是否存在于源文件中,并且每行必须以其中一个保留字开始。 在这门语言的程序可能会是这个样子:切换或if语句在java中编写解释程序

#COMMENTS 
LET.... (declares variables with values) 
INTEGER myINT 
STRING myString 
CALCULATE... 
PRINT 
PRINTLN 
END 

我可以使用一个开关块,而不是如果,循环,以找到并执行了这一切?我担心的是交换机不能在Java 6中使用Strings,这是我应该使用的,但是我看不到如何轻松分配各种int值,因此交换机可以工作。在此先感谢您的任何建议和建议!

+1

我想你已经回答了你自己的问题... – 2012-01-07 19:06:44

+0

请显示一些源代码...你有什么试过? – Yahia 2012-01-07 19:06:46

+1

正常输入将被标记化;令牌标识符或枚举可以在switch语句中使用。也就是说,没有必要 - 将令牌处理程序实现为接口impl并将它们转储到令牌处理程序映射中。 – 2012-01-07 19:20:10

回答

1

如果你的语言是如此简单,每个语句在其自己的行开始,以一个字只认,然后(如灰色的另一个评论指出),你可以拆分每行中的单词,然后将第一个单词与地图进行比较。不过,我会建议,而不是映射的话整数,然后做一个大的交换机,将它们映射到对象,而不是像这样(由戴维·牛顿建议):

interface Directive { 
    public void execute(String line); 
} 

class LetDirective implements Directive { 
    public void execute(String line) { ...handle LET directive here... } 
} 

...define other directives in the same way... 

然后定义地图:

private Map<String, Directive> directives = new HashMap<String, Directive>(); 
directives.put("LET", new LetDirective()); 
... 

然后在您的分析方法:

int firstSpace = line.indexOf(' '); 
String command = line; 
if (firstSpace > 0) 
    command = line.substring(0, firstSpace); 
Directive directive = directives.get(command.toUpperCase()); 
if (directive != null) 
    directive.execute(line); 
else 
    ...show some error... 

每个指令必须分析自身行的休息和正确处理其execute()方法中。

这对交换机的好处是,你可以处理大量的命令而不会结束一个巨大的方法,而是每个命令使用一个较小的方法。

1

如果你正在谈论将字符串转换为整数,那么你可以用Java的枚举类型做到这一点:

private enum ReservedWord { 
    LET, 
    ... 
} 

// skip blank lines and comments 
String[] tokens = codeLine.split(" "); 
ReservedWord keyword; 
try { 
    keyword = ReservedWord.valueOf(tokens[0]); 
} catch (IllegalArgumentException e) { 
    // spit out nice syntax error message 
} 

你也可以把该行的处理枚举内,如果你的方法”喜欢。你也可以用Map做到这一点:

private final Map<String, Integer> reservedWords = new HashMap<String, Integer>(); 
private final int RESERVED_WORD_LET 1 
... 
{ 
    reservedWords.put("LET", RESERVED_WORD_LET); 
    ... 
} 

// skip blank lines and comments 
String[] tokens = codeLine.split(" "); 
Integer value = reservedWords.get(tokens[0]); 
if (value == null) // handle error... ; 
switch (value) { 
    case 1: 
     // LET 
     ... 
}