当前位置: 首页 > 面试题库 >

在Java中编写解释器时切换或if语句

姚乐家
2023-03-14
问题内容

当前的工作需要我编写一个程序,以非常小的基本编程语言(行为类似于FORTRAN)读取包含指令的文件,并执行这些指令。基本上,这是我猜语言的简单解释器。它是完全线性的,所有语句都是按顺序定义的,并且只有String和integer变量。我需要找到并定义它们是否在源文件中存在8个关键字和4个算术运算符,并且每一行必须以保留字之一开头。使用这种语言的程序可能看起来像这样:

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

我可以使用切换块而不是if循环来查找然后执行所有这些操作吗?我担心的是,在Java
6中,开关不能与Strings一起使用,这是我应该使用的,但是我看不到如何轻松地分配各种int值,以使switch块正常工作。在此先感谢您的任何建议和意见!


问题答案:

如果您的语言是如此简单,以至于每个语句都以其一行开始并且仅由一个单词标识,那么(如Gray在另一条评论中指出的那样),您可以将每一行中的单词分开,然后将第一个单词与地图进行比较。但是,我建议不要像将单词映射到int然后进行一个大的切换那样,而是将它们映射到对象中,如下所示(由Dave
Newton建议):

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()方法中正确处理它。

与开关相比,这样做的好处是您可以处理大量命令,而不必以一个巨大的方法结束,而是每个命令只能使用一个较小的方法。



 类似资料:
  • 我有两个问题。 ①当useState初始值真假时,if语句如何适应下面? 比如说。。 ②当if语句为true和false时,如何使setGoodBotton从React钩子和if语句适应下面? 例如…(这不是工作)

  • 翻译的结果是什么?它会把高级语言变成汇编语言还是机器语言,即二进制代码? 如果是后者,这是否意味着解释语言与介绍集没有关系? 一种语言只能有一个口译员?是因为解释器不做任何优化,所以我们不需要找到更好的解释器吗?

  • 问题内容: 我有这个结构: 我想以相关方式显示我的段落。 我发现的唯一解决方案是基于专用功能,例如在Go和nested中进行测试: 实际上,我有更多的类型,这使它变得更加奇怪,使带有功能的Go代码和具有这些功能的模板都变得混乱。 什么是干净的解决方案?有一些或解决方案中去的模板?还是完全不同的方式来处理这些案件? 问题答案: 模板是无逻辑的。他们不应该具有这种逻辑。您可以拥有的最大逻辑是一堆。 在

  • 问题内容: 告诉我 少于3个分支的交换机效率低下,请改用if语句。 这是为什么?为什么是3?他们如何定义效率? 问题答案: 因为语句是使用两个特殊的JVM指令和编译的。在处理很多案例时它们很有用,但是当您只有很少的分支机构时,它们会导致开销。 相反,一条语句被编译为典型的 …链,这些链速度更快,但在长分支链中使用时需要更多的比较。 您可以通过查看字节码来看到差异,无论如何我都不担心这些问题,如果有

  • 问题内容: 为什么我们说Java是一种编译和解释语言? (编译和解释)这样做有什么好处? 问题答案: Java在编译时被编译为中间的“字节码”。这与像C之类的语言在编译时被编译为机器语言相反。Java字节代码无法像编译的C代码那样直接在硬件上执行。相反,字节码必须在运行时由JVM(Java虚拟机)解释才能执行。像C这样的语言的主要缺点是,当编译该二进制文件时,该二进制文件将仅在一种特定的体系结构(

  • 问题内容: 如何在MySQL查询中编写IF ELSE语句? 像这样: 然后在我的数组中,我应该能够做到这一点: 问题答案: 您可能要使用表达式。 他们看起来像这样: