我使用 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'
解决此问题的一种方法是编写所有可能的错误情况,但这永远不会结束,因为随着命令的增加,可能的错误情况也会增加,无论如何我可以告诉解析器,如果它不满足上述任何命令,则抛出一个常见错误?
提前致谢
我 gess,project
是 PROJECTCOMMAND
,-a
是ADDOPTION
,abcd
是NAMEOPTION
,解析器是第四节点 – TEXT
。您有一个、两个和四个节点的替代方案,但不能选择三个节点。
这是一个老问题,但我回答以防万一有人来到这里,这可能会有所帮助。
如果我理解正确,您想要的是能够拥有通用错误消息。
我正在做的是在尝试/捕获子句中围绕
.parse()
和 将错误消息替换为我想要的错误消息(特别是因为 复杂语法中的错误消息可能是巨大的)
但只是为了澄清错误:
问题是没有匹配的情况
"PROJECTCOMMAND ADDOPTION TEXT"
(project -a abcd)
您需要创建此规则。这就是您收到错误的原因。
使用project -a -n
时也是如此 您在那里遇到的错误是缺少要匹配的参数
"PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT"
我还会将规则重写为:
%%
("Project"|"project") return 'PROJECTCOMMAND';
"-au" return 'ADDUSER';
"-n" return 'NAMEOPTION';
"-k" return 'KEYOPTION';
"-desc" return 'DESCRIPTION';
("--add"|"-a") return 'ADDOPTION';
<TEXT>[-a-zA-Z0-9@.]+ {this.popState(); return 'TEXT';}
<INITIAL,TEXT>s+
<<EOF>> return 'EOF';
/lex
%start line
%%
line
: PROJECTCOMMAND options EOF
{
//enter code here
}
| PROJECTCOMMAND options TEXT EOF
{
//enter code here
}
;
options
: option
{
//enter code here
}
| options option
{
//enter code here
}
;
option
: ADDUSER
{
//enter code here
}
| NAMEOPTION
{
//enter code here
}
| KEYOPTION
{
//enter code here
}
| DESCRIPTION
{
//enter code here
}
| ADDOPTION
{
//enter code here
}
;
通过这种方式,您可以轻松地添加不同的选项并一起处理它们的行为。