【问题标题】:Error Handling in JISONJISON 中的错误处理
【发布时间】:2014-11-21 07:47:31
【问题描述】:

我已经使用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'  

解决此问题的一种方法是编写所有可能的错误情况,但这永远不会结束,因为随着命令的增加,可能的错误情况也会增加,无论如何我可以告诉解析器如果它不满足上述任何命令,那么抛出一个常见错误?

提前致谢

【问题讨论】:

    标签: javascript node.js yacc jison


    【解决方案1】:

    我猜,projectPROJECTCOMMAND-aADDOPTIONabcdNAMEOPTION,并且解析器是第四个节点 - TEXT。您可以选择 1 个、2 个和 4 个节点,但不能选择 3 个。

    【讨论】:

      【解决方案2】:

      这是一个老问题,但我正在回答以防万一有人在这里,这可能会有所帮助。

      如果我理解正确,您想要的是能够有一个通用的错误消息。

      我正在做的是在 try/catch 子句中包围 .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
             }
          ;
      

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

      【讨论】:

        猜你喜欢
        • 2016-03-17
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 2017-10-26
        相关资源
        最近更新 更多