gpt4 book ai didi

javascript - Jison 无视我的一条规则

转载 作者:行者123 更新时间:2023-11-29 18:17:18 27 4
gpt4 key购买 nike

我正在尝试使用 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 - Jison 无视我的一条规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962884/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com