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  

错误:期望文本并得到项目命令。
如果命令中的项目名称是 project1、project 2、myproject 等,也会发生同样的情况。有什么方法可以解决这个问题吗?
提前致谢

解决此问题的一种方法是使用状态。我在这里所说的"状态"的正式名称是"启动条件",但我发现"状态"对我来说比"启动条件"更清晰。

  1. 我已经用 %x TEXT 声明了一个新的词法分析器状态。有一个隐式存在的INITIAL状态。这是词法分析器启动的状态。任何未指定状态的模式都仅存在于INITIAL状态。

  2. 我已将<TEXT>放在生成TEXT令牌的模式前面,以便仅在我们处于TEXT状态时生成此令牌。

  3. 我已经设置了空白的模式以应用于状态INITIALTEXT

  4. 我这样做是为了让-n词法分析器进入TEXT状态,当遇到TEXT令牌时,状态会弹出。

有了这个,当 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;  
            }  ;

相关内容

  • 没有找到相关文章

最新更新