javascript - 吉森忽视了我的一条规则

标签 javascript lexical-analysis jison

我正在尝试使用 Jison。

这是我的语法:

var grammar = {
lex:{
    rules:[
        ["\\s+",            ""],
        ["then",            "return 'newline';"],
        ["goto",            "return 'goto';"],
        ["http[^\\s]*",     "return 'url';"],
        ["search",          "return 'search';"],
        ["should_exist",    "return 'exist';"],
        //["#(.)*",           "return 'elementById';"],
        //["$",               "return 'EOF';"]
    ]
},
bnf:{
    lines:[
        ['lines line',          "console.log('big expression is ',$3);  return ['l2',$1, $2];"],
        ['line',                "console.log('expression is ',$1); return ['l1',$1]"],
    ],
    line:[
        ["line newline",        "console.log('line newline', $1); $$ = $1"],
        ["goto url",            "console.log('goto', $2); $$ = {cmd:'goto', url: $2 } "],
        ["elementById exist",   "$$ = {cmd:'assert', elId: $1} "]
    ]
}
};

当我尝试解析 goto http://www.google.com 然后转到 http://www.bing.com 我只得到 [ 'l1', { cmd : 'goto', url: 'http://www.google.com' } ] 返回。

我希望返回两个 goto 命令。

有什么帮助我弄清楚我的语法吗?

最佳答案

代码中的主要问题是过早使用return。使用return将立即结束解析。。因此,如果您在并不意味着终止解析的规则中使用它,那么您就会遇到麻烦。我喜欢有一个规则,它是整个系统的入口点,它的工作只是用一些合理的东西来调用return

这里的东西更像你想要的。我没有对 lex 进行任何更改。

    bnf:{
        top: [
            ['lines', "console.log('top is ', $1);  return $1;"]
        ],
        lines:[
            ['lines line',          "console.log('big expression is ', $1);  $$ = ['l2', $1, $2];"],
            ['line',                "console.log('expression is ',$1); $$ = ['l1',$1]"],
        ],
        line:[
            ["line newline",        "console.log('line newline', $1); $$ = $1"],
            ["goto url",            "console.log('goto', $2); $$ = {cmd:'goto', url: $2 } "],
            ["elementById exist",   "$$ = {cmd:'assert', elId: $1} "]
        ]
    }

我得到的输出是:

goto http://www.google.com
line newline { cmd: 'goto', url: 'http://www.google.com' }
expression is  { cmd: 'goto', url: 'http://www.google.com' }
goto http://www.bing.com
big expression is  [ 'l1', { cmd: 'goto', url: 'http://www.google.com' } ]
top is  [ 'l2',
  [ 'l1', { cmd: 'goto', url: 'http://www.google.com' } ],
  { cmd: 'goto', url: 'http://www.bing.com' } ]

以下是您最初拥有的内容与我建议的内容之间的差异:

--- original.js 2014-02-23 08:10:37.605989877 -0500
+++ parser.js   2014-02-23 08:35:06.674952990 -0500
@@ -14,9 +14,12 @@
         ]
     },
     bnf:{
+        top: [
+            ['lines', "console.log('top is ', $1);  return $1;"]
+        ],
         lines:[
-            ['lines line',          "console.log('big expression is ',$3);  return ['l2',$1, $2];"],
-            ['line',                "console.log('expression is ',$1); return ['l1',$1]"],
+            ['lines line',          "console.log('big expression is ', $1);  $$ = ['l2', $1, $2];"],
+            ['line',                "console.log('expression is ',$1); $$ = ['l1',$1]"],
         ],
         line:[
             ["line newline",        "console.log('line newline', $1); $$ = $1"],

关于javascript - 吉森忽视了我的一条规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962884/

相关文章:

javascript - Python 中的浏览器 'window' 对象等效吗?

javascript - 如何获取字符串中元音的总数

在flex中创建简单的规则

c - 词法分析器: how to identify the end of a token

javascript - 使用 JISON 匹配但忽略嵌套括号

javascript - 谷歌地图 geoXML3 : passing a placemark into it's own event listener?

javascript - Ajaxurl 返回 0

c# - ANTLR:我可以让 ',' 成为一个上下文中的一个标记,而另一个在所述上下文之外吗?

javascript - 在 Jison 中制作数组

javascript - 将数据传递给 Jison 解析器