代码之家  ›  专栏  ›  技术社区  ›  fgalan

在Jison中使用自定义函数

  •  0
  • fgalan  · 技术社区  · 6 年前

    为了添加一个新的自定义函数,我正在和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)']]
        }
    }
    

    欢迎任何提示!

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Bunyan    6 年前

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

    推荐文章