所以我使用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;
}
我有什么方法可以对命令进行验证,即如果命令不满足上述任何规则,则抛出错误,.i.e。有默认选项。
在解析器末尾有这样的东西:
| return "command is invalid";
先谢谢
答案 0 :(得分:0)
这个问题没有答案,因为它比看起来更大。您正在询问从解析器生成器工具构建的解析器中提供有意义的错误消息的一般问题。多年来,这对编译器编写者和工具编写者来说一直是个问题。
解析器通常不像程序性程序那样工作,因为你不能像编程中的开关或if语句那样有“default”或“else”子句,虽然它似乎是一个简单的扩展,但它不是。正是由于这个原因,一些人仍然手写自己的自定义解析器,因为它使他们能够灵活地处理这种错误情况。错误情况是规则无法与文本匹配。关于这个主题已经写了很多学术论文,但可以在这里找到一个小例子讨论:http://research.swtch.com/yyerror。
你问过有关基于yacc / bison的JISON。在yacc / bison中,错误情况由built in feature known as yyerror处理。这样可以将故障错误消息自定义为“命令无效”。据我所知,this feature is not yet implemented in 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 ....
正如你所看到的那样既恐怖又不尽如人意。