我正在寻找一个库或一组库来帮助我编写一个宽容的命令解释器。
宽容的命令解释器将是一个命令解释器,它可以处理输入中的简单甚至不那么简单的拼写和字序错误。
我的目标是让一个解释器接受用户的输入(命令)然后:
执行命令,如果正确的话。
对命令应用更正, 直到生成正确的命令 然后将该命令呈现给 用户确认是否是'什么 用户的意思是'。
例如:
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)
答案 0 :(得分:1)
JNode中的命令解释器执行命令完成,该命令解释知道每个命令的语法和命令参数语义。它不处理拼写/输入错误,但如果你使用完成它们就不是问题了。
答案 1 :(得分:0)
看看Peter Norvig的How to Write a Spelling Corrector。他的算法可以帮助你捕捉简单的错别字。