PyPy Ошибка перевода
Я надеюсь, что это правильное место для этого вопроса. Я пытаюсь написать простой интерпретатор с поддержкой JIT. Тем не менее, я попадаю в странную ошибку, когда дело доходит до перевода. Я скопировал синтаксический анализатор примера JavaScript почти дословно, но вот мои проблемы:
Прежде всего, вот парсер (почти на 100% как пример JS):
from pypy.rlib.parsing.ebnfparse import parse_ebnf, make_parse_function
from pypy.rlib.parsing.parsing import ParseError, Rule
import py
import sys
GFILE = py.magic.autopath().dirpath().join("grammar.txt")
try:
t = GFILE.read(mode="U")
regexs, rules, ToAST = parse_ebnf(t)
except ParseError, e:
print e.nice_error_message(filename=str(GFILE), source=t)
raise
parsef = make_parse_function(regexs, rules, eof=True)
def parse(code):
t = parsef(code)
return ToAST().transform(t)
и моя грамматика:
STRING: "\\"[^\\\\"]*\\"";
SYMBOL: "[A-Za-z+-_*<>]+";
KEYWORD: ":[A-Za-z+-_*<>]+";
INTEGER: "\-?([0-9]+)";
DECIMAL: "\-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][\+\-]?[0-9]+)?";
IGNORE: " |\n|\t|,";
value: <KEYWORD> | <SYMBOL> | <STRING> | <DECIMAL> | <INTEGER> |
<hash> | <vector> | <sexps>;
hash: ["{"] (entry [","])* entry ["}"];
vector: ["["] value* ["]"];
entry: STRING [":"] value;
sexps: ["("] value+ [")"];
Я делаю следующее, чтобы скомпилировать код для c:
import parse
t = Translation(parse.parse)
t.annotate([str])
t.rtype()
t.compile_c()
>>>
<---snip---->
File "/home/tbaldridge/pypy/pypy/translator/c/genc.py", line 339, in
getentrypointptr
self._wrapper = new_wrapper(self.entrypoint, self.translator)
File "/home/tbaldridge/pypy/pypy/translator/llsupport/wrapper.py",
line 57, in new_wrapper
r_to = pyobj_repr)
File "/home/tbaldridge/pypy/pypy/rpython/rtyper.py", line 931, in convertvar
(r_from, r_to))
pypy.rpython.error.TyperError: don't know how to convert from
<InstanceRepr for pypy.rlib.parsing.tree.Node> to <PyObjRepr *
PyObject>
Что мне не хватает? Это выглядело так просто...
2 ответа
Ваша функция возвращает узел AST на уровне RPython, который после трансляции является структурой C. Переводчик не знает, как представить это в интерпретаторе Python, чтобы возвращать результат при вызове функции.
в C функция main() может возвращать только целое число. В pypy интерактивный переводчик может передавать и возвращать строки, целые числа, числа с плавающей запятой и кортежи. Вы должны обработать узлы ast и вернуть базовые типы.
Это очень специфический вопрос, связанный с pypy, и вы, скорее всего, получите ответы на #pypy на irc.freenode.net или на pypy-dev.
Тем не менее, вы не должны использовать интерактивный перевод для этого (среди прочего он имеет безумные значения по умолчанию). Вместо этого вы должны написать цель (посмотрите в качестве примера в translationator/goal/targetnopstandalone.py) и используйте translate.py для ее компиляции.