嗨,我是 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
声明了一个新的词法分析器状态。有一个INITIAL
隐式存在的状态。这是词法分析器启动时的状态。任何未获得指定状态的模式仅存在于INITIAL
中。状态。我已经输入了
<TEXT>
在导致TEXT
的模式前面 token ,以便仅当我们位于TEXT
时才生成此 token 。状态。我已设置空白模式以应用于状态
INITIAL
和TEXT
.我做到了
-n
导致词法分析器输入TEXT
状态和当TEXT
遇到 token,则弹出状态。
有了这个,当 Jison 遇到 -n
时在project -a -n project
它进入TEXT
状态唯一期望的是空格,它被忽略,或 TEXT
代币。然后 Jison 处理空白,并忽略它。然后它处理后面的文本,该文本被理解为 TEXT
token 并弹出状态。
完整代码:
%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;
} ;
关于javascript - JISON 解析命令时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27036320/