0

所以我生成了一个解析器,使用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";

提前致谢

4

1 回答 1

0

这个问题没有答案,因为它比看起来要大。您正在询问从解析器生成器工具构建的解析器提供有意义的错误消息的一般问题。多年来,这一直是编译器编写者和工具编写者的问题。

解析器通常不像过程程序那样工作,因为你不能像编程时在 switch 或 if 语句中那样拥有“default”或“else”子句,尽管它看起来像是一个简单的扩展,但实际上并非如此。正是由于这个原因,有些人仍然手工编写自己的自定义解析器,因为它使他们能够灵活地处理此类错误情况。错误情况是规则无法匹配文本。关于这个主题已经写了很多学术论文,但是可以在这里找到一个小的示例讨论:http ://research.swtch.com/yyerror 。

您询问了基于 yacc/bison 的 JISON。在 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 ....

如您所见,这既可怕又不令人满意。

于 2015-02-17T16:52:39.990 回答