java - java自动机的简单枚举

标签 java enums compiler-errors fsm automaton

我正在尝试实现这个自动机示例:http://www.javacodegeeks.com/2012/03/automaton-implementation-in-java.html .

但是,运行程序时一直报错:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
           String index out of range: 3
at java.lang.String.charAt(String.java:686)
at mealy.Input.read(Input.java:7)
at mealy.States$4.next(Input.java:46)
at mealy.Test.main(Test.java:9)

我尝试修改导致错误的行,但没有任何改变。有人可以看看这个程序并帮我找到解决方案吗?

我有以下 .java :

State.java :

interface State {
    public State next(Input in);
}

注意:我必须将原来的“public Stat next()”更改为“public State next(Input in);”

输入.java :

class Input {
    private String input;
    private int current;
    public Input(String input) {this.input = input;}
    char read() { return input.charAt(current++); }
}

enum States implements State {
    Init {
        @Override
        public State next(Input word) {
            switch(word.read()) {
                case 'a': return A;
                default: return Fail;
            }
        }
    },
    A {
        @Override
        public State next(Input word) {
            switch(word.read()) {
                case 'a': return A;
                case 'b': return B;
                case 'c': return C;
                case 'd': return null;
                default: return Fail;
            }
        }
    },
    B {
        @Override
        public State next(Input word) {
            switch(word.read()) {
                case 'b': return B;
                case 'c': return C;
                case 'd': return null;
                default: return Fail;
            }
        }
    },
    C {
        @Override
        public State next(Input word) {
            switch(word.read()) {
                case 'c': return C;
                case 'd': return null;
                default: return Fail;
            }
        }
    },
    Fail {
        @Override
        public State next(Input word) {
               return Fail;
        }
    };

    public abstract State next(Input word);
}

测试.java :

public class Test {
    public static void main(String args[]){
        State s;
        Input in = new Input("abc");

        for(s = States.Init; s != null || s != States.Fail; s = s.next(in)) {}
        if(s == States.Init) {System.out.println("Valid!");}
        else {System.out.println("Failed");}
    }
}

最佳答案

Input 类中似乎存在错误。当您尝试读取最后一个字符之后的字符时,它会抛出您未在 main 中处理的异常。我会更改输入,以便它返回一个您可以在状态机中处理的 token 。

顺便说一句,我建议您查看此内容以了解上下文。 http://vanillajava.blogspot.co.uk/2011/06/java-secret-using-enum-as-state-machine.html

我假设 Attila 希望提供一个简单、有效的示例。我会看看他是否可以修复他的代码。

关于java - java自动机的简单枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19764063/

相关文章:

java - 使用 Timer 类时出错,需要简单的方法来制作倒数计时器

Java "constant string too long"编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生

api - 在 JDK 之外使用 Attach API

java - Netbeans 的 Eclipse Web 服务资源管理器的替代方案

java - 是否可以/可能修改枚举声明中的实例变量?

swift - 嵌套类中名为 `Type` 的枚举失败

java - 运行jar时配置服务器端口

c# - AutoMapper:在映射过程中忽略特定的字典项

Swift 3 如何在自定义类上声明赋值运算符

c++ - 如何自定义 clang 的包含路径顺序?