JISON 中的错误处理



我使用 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,projectPROJECTCOMMAND-aADDOPTIONabcdNAMEOPTION,解析器是第四节点 – 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
       }
    ;

通过这种方式,您可以轻松地添加不同的选项并一起处理它们的行为。

相关内容

  • 没有找到相关文章

最新更新