最宽松的命令解释器Java库

时间:2010-04-24 06:45:41

标签: java parsing interpreter

我正在寻找一个库或一组库来帮助我编写一个宽容的命令解释器。

宽容的命令解释器将是一个命令解释器,它可以处理输入中的简单甚至不那么简单的拼写和字序错误。

我的目标是让一个解释器接受用户的输入(命令)然后:

  1. 执行命令,如果正确的话。

  2. 对命令应用更正, 直到生成正确的命令 然后将该命令呈现给 用户确认是否是'什么 用户的意思是'。

  3. 例如:

    GlassFish Server有一个名为asadmin的命令行管理界面。它允许用户编写与服务器的交互脚本并以交互方式使用它。

    asadmin命令具有相当严格的结构:

    asadmin <asadmin options> <subcommand> <subcommand-options> <operand>
    

    asadmin命令当前尝试帮助错误拼写命令的用户,如下所示:

    vkraemer$ ../../GlassFish3.0.1.b12/glassfish/bin/asadmin creat-domain --user foobar --portbase 2600 fubar
    Deprecated syntax, instead use:
    asadmin --user foobar creat-domain [options] ...
    Remote server does not listen for requests on [localhost:4848].
    Is the server up?
    Unable to get remote commands. 
    Closest matching local command(s): 
        create-domain
    Command creat-domain failed.
    

    这是一个非常好的捕捉。当拼写错误的选项时,它并不那么聪明。

    我想删除输入上的几乎所有约束,以允许用户在命令中犯了多个错误,但仍然达到了他们有机会执行命令的程度。

    考虑这个例子HCI:

    vkraemer$ ../../GlassFish3.0.1.b12/glassfish/bin/asadmin create-domain foobar
    Enter admin user name [Enter to accept default "admin" / no password]> 
    Domain foobar already exists in /Users/vkraemer/GlassFish3.0.1.b12/glassfish/domains. Use a different domain name or the --domaindir option.
    CLI130 Could not create domain, foobar
    Command create-domain failed.
    VBKMacBookPro:web-main vkraemer$ ../../GlassFish3.0.1.b12/glassfish/bin/asadmin create-domain foobar --domaindi /tmp/test
    Enter admin user name [Enter to accept default "admin" / no password]> 
    Command create-domain only accepts one operand
    Usage: asadmin [asadmin-utility-options] create-domain
        [--adminport <adminport(default:4848)>]
        [--instanceport <instanceport(default:8080)>] [--portbase <portbase>]
        [--profile <profile>] [--template <template>] [--domaindir <domaindir>]
        [--savemasterpassword[=<savemasterpassword(default:false)>]]
        [--domainproperties <domainproperties>]
        [--keytooloptions <keytooloptions>]
        [--savelogin[=<savelogin(default:false)>]]
        [--checkports[=<checkports(default:true)>]]
        [--nopassword[=<nopassword(default:false)>]]
        [-?|--help[=<help(default:false)>]] domain_name
    Command create-domain failed.
    

    能够允许第二个命令成功完成会很好,即使选项--domaindir拼写不正确且位于命令中的“错误位置”。

    例如,第二个create-domain命令的输出可能是

    VBKMacBookPro:web-main vkraemer$ ../../GlassFish3.0.1.b12/glassfish/bin/asadmin create-domain foobar --domaindi /tmp/test
    Enter admin user name [Enter to accept default "admin" / no password]> 
    Did you mean "create-domain --domaindir /tmp/test foobar"? (yes)
    

2 个答案:

答案 0 :(得分:1)

JNode中的命令解释器执行命令完成,该命令解释知道每个命令的语法和命令参数语义。它不处理拼写/输入错误,但如果你使用完成它们就不是问题了。

答案 1 :(得分:0)

看看Peter Norvig的How to Write a Spelling Corrector。他的算法可以帮助你捕捉简单的错别字。