嗨,我是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等,也会发生同样的情况。 有什么办法可以解决这个问题吗? 提前致谢
答案 0 :(得分:1)
解决此问题的一种方法是使用状态。我称之为“州”的正式名称是“开始条件”,但我发现“状态”对我来说比“开始条件”更清晰。
我用%x TEXT
声明了一个新的词法分析器状态。隐式存在INITIAL
状态。这是词法分析器开始的状态。任何未获得指定状态的模式仅存在于INITIAL
状态。
我已将<TEXT>
放在导致TEXT
令牌的模式前面,以便当我们位于{{}}时,此标记仅生成 {1}}州。
我已设置空白模式以应用于状态TEXT
和INITIAL
。
我已经做到这一点,TEXT
导致词法分析器进入-n
状态,当遇到TEXT
标记时,弹出状态。
有了这个,当Jison在TEXT
遇到-n
时,它会进入project -a -n project
状态,其中唯一预期的是空格,这些空格被忽略,或TEXT
令牌。然后杰森处理它忽略的白色空间。然后它处理后面的文本,该文本被理解为TEXT
令牌并弹出状态。
完整代码:
TEXT