Javascript JISON与解析命令有关
您好,我是JISON的新手,我被困在以下代码中:Javascript JISON与解析命令有关,javascript,node.js,yacc,lex,jison,Javascript,Node.js,Yacc,Lex,Jison,您好,我是JISON的新手,我被困在以下代码中: 要分析命令,请执行以下操作: project -a -n <projectname> 如果命令如下所示,则可以正常工作: "project" {return 'PROJECTCOMMAND';} "-n" {return 'NAMEOPTION';} ("--add"|"-a") {return 'ADDOPTION';} [-a-zA-Z0-9@\.]+ {return 'TEXT';} line
要分析命令,请执行以下操作:
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
声明了一个新的lexer状态。存在一个隐式存在的初始
状态。这是lexer启动的状态。任何未获得指定状态的模式都只存在于初始状态中
放在产生文本
标记的模式前面,这样只有当我们处于文本
状态时才会生成该标记INITIAL
和TEXT
-n
使lexer进入文本
状态,当遇到文本
标记时,该状态被弹出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;
} ;
%lex
%x文本
%%
“项目”{return'PROJECTCOMMAND';}
“-n”{this.begin('TEXT');返回'namepoption';}
(“--add”|“-a”){return'ADDOPTION';}
[-a-zA-Z0-9@\.]+{this.popState();返回'TEXT';}
\s+//忽略空白。。。
/莱克斯
%%
行:
PROJECTCOMMAND添加选项名称选项文本
{
//以项目名称作为参数的Prject命令
var res=新对象();
res.value=“addProject name”;
res.name=$4;
返回res;
} ;
感谢您的回复,您能和我分享一些我可以了解这些状态的教程吗,begin('TEXT')、popState()