2011-03-04 99 views
2

我希望这是这个问题的正确位置。我正在尝试编写一个简单的JIT启用的解释器 。但是,当涉及到翻译时,我遇到了一个奇怪的错误 。我复制了JavaScript示例 解析器几乎一字不差,但这里是我的问题:PyPy翻译错误

首先,这里的解析器(几乎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> 

我错过了什么?这看起来是那么直截了当....

回答

3

您的函数返回一个RPython级别的AST节点,它是翻译后的C结构。翻译器不知道如何在Python解释器中表示这个函数,以便在函数被调用时返回结果。

在C中,main()函数只能返回一个整数。在pypy中,交互式翻译器可以传递并返回字符串,整数,浮点数和元组。 您应该处理ast节点并返回基本类型。

3

这是一个非常特殊的pypy有关的问题,你就更有可能得到irc.freenode.net上或者要求在pypy-dev的上#pypy答案。

这就是说,你不应该使用交互式翻译(除其他事项外,它有疯狂的默认值)。相反,您应该编写一个目标(例如,查看译者/目标/ targetnopstandalone.py)并使用translate.py进行编译。

+1

我希望我可以接受这两个答案,谢谢你的信息,但我会在irc很快 – 2011-03-04 14:22:58