gpt4 book ai didi

javascript - 在 Jison 中使用自定义函数

转载 作者:行者123 更新时间:2023-12-03 00:59:20 25 4
gpt4 key购买 nike

我正在使用 Jison 来添加新的自定义函数。从 Jison documentation 处的示例开始:

{
"lex": {
"rules": [
["\\s+", "/* skip whitespace */"],
["[0-9]+(?:\\.[0-9]+)?\\b", "return 'NUMBER';"],
["\\*", "return '*';"],
["\\/", "return '/';"],
["-", "return '-';"],
["\\+", "return '+';"],
["\\^", "return '^';"],
["\\(", "return '(';"],
["\\)", "return ')';"],
["PI\\b", "return 'PI';"],
["E\\b", "return 'E';"],
["$", "return 'EOF';"]
]
},

"operators": [
["left", "+", "-"],
["left", "*", "/"],
["left", "^"],
["left", "UMINUS"]
],

"bnf": {
"expressions" :[[ "e EOF", "print($1); return $1;" ]],

"e" :[[ "e + e", "$$ = $1 + $3;" ],
[ "e - e", "$$ = $1 - $3;" ],
[ "e * e", "$$ = $1 * $3;" ],
[ "e / e", "$$ = $1 / $3;" ],
[ "e ^ e", "$$ = Math.pow($1, $3);" ],
[ "- e", "$$ = -$2;", {"prec": "UMINUS"} ],
[ "( e )", "$$ = $2;" ],
[ "NUMBER", "$$ = Number(yytext);" ],
[ "E", "$$ = Math.E;" ],
[ "PI", "$$ = Math.PI;" ]]
}
}

如果我将函数的代码添加到 e 数组中,它就会起作用:

{
"lex": {
"rules": [
...
['sin', 'return "SIN";'],
]
},

...

"bnf": {
...
"e" :[...,
['SIN ( e )', '$$ = Math.sin($3)']]
}
}

但是,尝试将其添加为自定义函数,但失败了:

function mySin(x) {
return Math.sin(x);
}

{
"lex": {
"rules": [
...
['sin', 'return "SIN";'],
]
},

...

"bnf": {
...
"e" :[...,
['SIN ( e )', '$$ = mySin($3)']]
}
}

我是 Jison 的新手,所以也许我做错了什么。我尝试在文档和现有问题中找到解决方案,但失败了。

欢迎任何提示!

最佳答案

我在 nodejs/CommonJS 模式下运行 jison 时遇到了类似的问题。我的问题是解析器在全局范围内运行,所以我发现如果我使用语法 global.myFunction = function(x) {} 定义函数,那么应该从以下操作中引用它们解析器。我认为有点黑客攻击,我相信其他人可能有更优雅的解决方案。

关于javascript - 在 Jison 中使用自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701162/

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