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

最佳答案

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

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

  2. 我已经输入了 <TEXT>在导致 TEXT 的模式前面 token ,以便仅当我们位于 TEXT 时才生成此 token 。状态。

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

  4. 我做到了 -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/

相关文章:

javascript - 如何使用链接标签

c - 为什么 Visual Studio 2012 在未更改源文件时运行自定义构建步骤?

c++ - 将 char 数组输入到 stdin

parsing - Bison 减少/减少与强制转换和表达式括号的冲突

javascript - 为什么 postMessage 脚本在 IE8 中不起作用?

javascript - 无法读取未定义的属性

javascript - 访问指令的隔离范围与嵌入的内容

node.js - 使用带有 Passportjs : what is accessToken for, 的 Facebook 进行身份验证 注册后我应该存储什么?

node.js - 一起使用 S3 作为静态网页和 EC2 作为 REST API? (AWS)

javascript - Node.js - Socket.IO 1.0 - 超时事件