0

嗨,我是新手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 等,也会发生同样的情况。有什么办法可以解决这个问题吗?
提前致谢

4

1 回答 1

1

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

  1. 我已经声明了一个新的词法分析器状态%x TEXT。有一种INITIAL状态是隐含存在的。这是词法分析器启动的状态。任何没有得到指定状态的模式只存在于INITIAL状态中。

  2. 我已经把生成令牌<TEXT>的模式放在前面,这样只有在我们处于状态时TEXT才会生成这个令牌。TEXT

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

  4. 我已经做到了,这-n会导致词法分析器进入TEXT状态,并且当TEXT遇到令牌时,会弹出状态。

有了这个,当 Jison 遇到它时-nproject -a -n project它会进入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;  
            }  ;
于 2014-11-20T13:52:13.907 回答