Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JISON与解析命令有关_Javascript_Node.js_Yacc_Lex_Jison - Fatal编程技术网

Javascript JISON与解析命令有关

Javascript JISON与解析命令有关,javascript,node.js,yacc,lex,jison,Javascript,Node.js,Yacc,Lex,Jison,您好,我是JISON的新手,我被困在以下代码中: 要分析命令,请执行以下操作: project -a -n <projectname> 如果命令如下所示,则可以正常工作: "project" {return 'PROJECTCOMMAND';} "-n" {return 'NAMEOPTION';} ("--add"|"-a") {return 'ADDOPTION';} [-a-zA-Z0-9@\.]+ {return 'TEXT';} line

您好,我是JISON的新手,我被困在以下代码中:
要分析命令,请执行以下操作:

 project -a -n <projectname>  
如果命令如下所示,则可以正常工作:

"project"   {return 'PROJECTCOMMAND';}
"-n"        {return 'NAMEOPTION';}
("--add"|"-a")  {return 'ADDOPTION';}  
[-a-zA-Z0-9@\.]+ {return 'TEXT';}

line :   
   PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT 
            {
                //Prject command with project name as argument
                var res = new Object();
                res.value = "addProject name";
                res.name = $4;
                return res;  
            }  
project -a -n samplePro  
但如果命令为:

project -a -n project  
错误:需要文本,但获取了PROJECTCOMMAND。
如果命令中的项目名称为project1、project2、myproject等,也会发生同样的情况。。 有什么办法可以解决这个问题吗?

提前感谢

解决此问题的一种方法是使用状态。这里我称之为“状态”的正式名称是“开始条件”,但我发现“状态”对我来说比“开始条件”更清楚

  • 我已经用
    %x TEXT
    声明了一个新的lexer状态。存在一个隐式存在的
    初始
    状态。这是lexer启动的状态。任何未获得指定状态的模式都只存在于
    初始状态中

  • 我已经将
    放在产生
    文本
    标记的模式前面,这样只有当我们处于
    文本
    状态时才会生成该标记

  • 我已将空白模式设置为应用于状态
    INITIAL
    TEXT

  • 我这样做是为了
    -n
    使lexer进入
    文本
    状态,当遇到
    文本
    标记时,该状态被弹出

  • 这样,当Jison在
    project-a-n project
    中遇到
    -n
    时,它会进入
    TEXT
    状态,在该状态下,唯一需要的是被忽略的空格或
    TEXT
    标记。Jison然后处理空白,忽略空白。然后它处理后面的文本,该文本被理解为
    text
    标记,并弹出状态

    完整代码:

    %lex
    
    %x TEXT
    
    %%
    "project"   {return 'PROJECTCOMMAND';}
    "-n"        {this.begin('TEXT'); return 'NAMEOPTION';}
    ("--add"|"-a")  {return 'ADDOPTION';}  
    <TEXT>[-a-zA-Z0-9@\.]+ {this.popState(); return 'TEXT';}
    <INITIAL,TEXT>\s+         // Ignore white space...
    
    /lex
    
    %%
    
    line :   
       PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT 
                {
                    //Prject command with project name as argument
                    var res = new Object();
                    res.value = "addProject name";
                    res.name = $4;
                    return res;  
                }  ;
    
    %lex
    %x文本
    %%
    “项目”{return'PROJECTCOMMAND';}
    “-n”{this.begin('TEXT');返回'namepoption';}
    (“--add”|“-a”){return'ADDOPTION';}
    [-a-zA-Z0-9@\.]+{this.popState();返回'TEXT';}
    \s+//忽略空白。。。
    /莱克斯
    %%
    行:
    PROJECTCOMMAND添加选项名称选项文本
    {
    //以项目名称作为参数的Prject命令
    var res=新对象();
    res.value=“addProject name”;
    res.name=$4;
    返回res;
    }  ;
    
    感谢您的回复,您能和我分享一些我可以了解这些状态的教程吗,begin('TEXT')、popState()