在Jison中使用自定义函数

时间:2018-10-08 11:21:14

标签: javascript jison

我正在和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的新手,所以也许我做错了事。我试图在文档和现有问题中找到解决方案,但失败了。

欢迎任何提示!

1 个答案:

答案 0 :(得分:1)

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