// 基于数组构造 DFA 状态表,解析出一个字符串中的所有整数和小数
// LJJ 2024.12.10
import std.collection.* 

class Parser {
    static let states = Array(5, {_: Int64 => Array(128, repeat: 0)})
    static init() {
        states[0][45..58] = [1, 2, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] // INIT
        states[1][45..58] = [0, 2, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] // -
        states[2][45..58] = [0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] // . | -. | N. | -N.
        states[3][45..58] = [0, 2, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] // N or -N
        states[4][45..58] = [0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] // ACCEPT
    }

    static public func parse(text: String) {
        var i = 0
        while (i < text.size) {
            var s = 0
            while (i < text.size && states[s][Int64(text[i])] == 0) {
                i++
            }
            let j = i
            while (i < text.size && states[s][Int64(text[i])] != 0) {
                s = states[s][Int64(text[i])]
                i++
            }
            if (s == 3 || s == 4) {
                print(text[j..i] + ' ')
            }
        }
        println()
    } 
}

main() {
    Parser.parse("1 2 3 456 789")
    Parser.parse("1ab2c3")
    Parser.parse("apple 30 banana 45")
    Parser.parse("1.2 3.4")
    Parser.parse("9- -3 -2")
    Parser.parse("3-2")
    Parser.parse("1 2 3-2")
    Parser.parse("xxx-3.14. .56-238jk12")
}