嗨,我是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 等,也会发生同样的情况。有什么方法可以解决这个问题吗?
提前致谢
解决此问题的一种方法是使用状态。我在这里所说的"状态"的正式名称是"启动条件",但我发现"状态"对我来说比"启动条件"更清晰。
-
我已经用
%x TEXT
声明了一个新的词法分析器状态。有一个隐式存在的INITIAL
状态。这是词法分析器启动的状态。任何未指定状态的模式都仅存在于INITIAL
状态。 -
我已将
<TEXT>
放在生成TEXT
令牌的模式前面,以便仅在我们处于TEXT
状态时生成此令牌。 -
我已经设置了空白的模式以应用于状态
INITIAL
和TEXT
。 -
我这样做是为了让
-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;
} ;