繁体   English   中英

Java或Scala for FSM解析器?

[英]Java or Scala for FSM Parser?

我需要为表示为文本的输入类型构建一个简单的解析器。

我已经使用两个int数组在Java中实现了FSM:

states[][]
actions[][] 

在调试时,我意识到使用Java Enums可能会更容易,因为这些类型的变量应该在IntelliJ的调试视图中显示为值。 但是,当我沿着这条路径开始时,似乎使用Enums的唯一方法是将状态表和操作表放在HashMap中-还是有一种方法可以制作一个多维数组,其中维是Enum值? 如果我能帮助的话,我宁愿不要接受HashMap带来的对象创建和性能方面的打击。

当时我以为我可以看看Scala,看看它是否是更好的选择。

因此,问题是-Scala是表示紧密FSM的更好语言还是我最好还是坚持使用Java int数组?

我衷心建议您看一下Scala,它是一种很棒的语言,非常值得评估。 但是,您所描述的问题并不单单是选择一种新语言的充分理由。 如果你学会了Scala中,这是很可能实现你FSM解析器比用Java更容易-但是学习Scala加上实现一个简单的FSM解析器,大概没有超过只是做它用Java更容易。

此外,还不清楚您要详细了解什么:是否要按Enum值索引数组? 您可以打字。 您是否想要数组容纳枚举? 那应该工作。 您想将内部数组解释为枚举吗? 编写一个包装函数,该函数创建一个对象,该对象为您提供所需外观的视图。

多维枚举数组很好。

以下内容对您没有帮助(也许我误解了您的问题):

public class SO {

    public static void main( String[] args ) {
        States[][] array = new States[0][];
    }

    private enum States {
        a,
        b
    }    
}

如果您拥有庞大的FSM或其中很多(例如您可以在游戏中使用),并且正确地想躲避不必要的对象创建(以及确实可以杀死您的游戏的不必要的GC),那么肯定可以使用Java枚举来获得一些安全,但具有有效的代码。

另一个好处是,如果我没记错默认的(快速)表开关(而不是a脚的查找开关),那么Java枚举中的“ case”语句就可以了。

在我看来,您主要关心的是性能。 尽管有很多原因可以在Scala中做到这一点,但使其更快并不是其中之一。 如果要注意避免更高级别的抽象,它将与Java一样快,但不会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM