Используйте пользовательские функции в Jison - PullRequest
0 голосов
/ 08 октября 2018

Я играю с Jison, чтобы добавить новую пользовательскую функцию.Начиная с примера в Документация Jison :

{
    "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 голосов
/ 08 октября 2018

У меня такая же проблема с jison, работающим в режиме nodejs / CommonJS.Моя проблема в том, что синтаксический анализатор работает в глобальной области видимости, поэтому я обнаружил, что если я определяю свои функции с синтаксисом global.myFunction = function(x) {}, то на них следует ссылаться OK из действий синтаксического анализатора.Думаю, что-то вроде взлома, я уверен, что у кого-то еще может быть более элегантное решение.

...