所以我使用 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;
}
有什么方法可以对命令进行验证,即如果命令不满足上述任何规则,则抛出错误,即具有默认选项。
解析器末尾的类似内容:
| return "command is invalid";
提前致谢
这个问题还没有答案,因为它比看起来要大。您询问的是从解析器生成器工具构建的解析器中给出有意义的错误消息的一般问题。多年来,这一直是编译器编写者和工具编写者的问题。
解析器通常不像过程程序那样工作,因为您不能像在编程时在开关或 if 语句中那样使用"默认"或"else"子句,尽管它看起来很容易扩展,但事实并非如此。正是出于这个原因,有些人仍然手动编写自己的自定义解析器,因为它使他们能够灵活地处理此类错误情况。错误情况是规则与文本不匹配。关于这个主题已经写了很多学术论文,但在这里可以找到一个小的例子讨论:http://research.swtch.com/yyerror。
你问了JISON,它基于yacc/bison。在 yacc/bison 中,错误情况由称为 yyerror 的内置功能处理。这使失败错误消息可以自定义为"命令无效"之类的内容。据我所知,此功能尚未在 JISON 中实现。
在这种情况下,您必须修改语法规则,以便对所有可能的替代项(将成为错误消息)进行操作。例如:
| PROJECTCOMMAND ADDOPTION NAMEOPTION
{ // Error
return something;
}
| ADDOPTION NAMEOPTION TEXT
{ // Error
return something;
}
| NAMEOPTION TEXT
{ // Error
return something;
}
| TEXT
{ // Error
return something;
}
| ADDOPTION TEXT
{ // Error
return something;
}
.... and every other combination of tokens ....
正如你所看到的,这既可怕又不令人满意。