我使用以下方法生成了一个解析器JISON
:
%lex
%x TEXT
%%
("Project"|"project") {return 'PROJECTCOMMAND';}
"-au" {return 'ADDUSER';}
"-n" {this.begin('TEXT'); return 'NAMEOPTION';}
"-k" {return 'KEYOPTION';}
"-desc" {return 'DESCRIPTION';}
("--add"|"-a") {return 'ADDOPTION';}
<TEXT>[-a-zA-Z0-9@\.]+ {this.popState(); return 'TEXT';}
<INITIAL,TEXT>\s+ // Ignore white space...
/lex
%%
line :
PROJECTCOMMAND ADDUSER
{
//Project Command of add user
var res = new Object();
res.value = "addUser Project";
return res;
}
| PROJECTCOMMAND ADDOPTION
{
//Project Command with no arguments
var res = new Object();
res.value = "addProject";
return res;
}
| PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT
{
//Project command with project name as argument
var res = new Object();
res.value = "addProject name";
res.name = $4;
return res;
}
以上工作正常如果我给出如下命令:
project -a
project -au
project -a -n abc
...
但是如果我输入这样的命令会给出错误:
project -a abcd
它抛出一个错误。
同样的方式如果我给出一个命令
project -a -n
错误:
Expecting 'TEXT' got `1'
解决此问题的一种方法是编写所有可能的错误情况,但这将永远不会结束,因为随着命令的增加,可能的错误情况也会增加,无论如何我可以告诉解析器如果它不满足上述任何命令然后抛出一个常见的错误?
提前致谢