Я играю с 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, поэтому, возможно, я делаю что-то не так.Я пытался найти решение в документации и существующих вопросах, но мне не удалось.
Любая подсказка приветствуется!