JISON与解析命令有关

时间:2014-11-20 09:45:50

标签: 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 :   
   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  

错误:期待TEXT并获得了PROJECTCOMMAND 如果命令中的项目名称是project1,project2,myproject等,也会发生同样的情况。 有什么办法可以解决这个问题吗? 提前致谢

1 个答案:

答案 0 :(得分:1)

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

  1. 我用%x TEXT声明了一个新的词法分析器状态。隐式存在INITIAL状态。这是词法分析器开始的状态。任何未获得指定状态的模式仅存在于INITIAL状态。

  2. 我已将<TEXT>放在导致TEXT令牌的模式前面,以便当我们位于{{}}时,此标记仅生成 {1}}州。

  3. 我已设置空白模式以应用于状态TEXTINITIAL

  4. 我已经做到这一点,TEXT导致词法分析器进入-n状态,当遇到TEXT标记时,弹出状态。

  5. 有了这个,当Jison在TEXT遇到-n时,它会进入project -a -n project状态,其中唯一预期的是空格,这些空格被忽略,或TEXT令牌。然后杰森处理它忽略的白色空间。然后它处理后面的文本,该文本被理解为TEXT令牌并弹出状态。

    完整代码:

    TEXT