2

これがこの質問にふさわしい場所であることを願っています。単純なJIT対応のインタープリターを作成しようとしています。しかし、翻訳に関しては奇妙なエラーが発生しています。JavaScriptのサンプルパーサーをほぼ逐語的にコピーしましたが、ここに私の問題があります。

まず第一に、ここにパーサーがあります(JSの例のようにほぼ100%):

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>

私は何が欠けていますか?これはとても簡単に思えました...

4

2 に答える 2

3

関数は、変換後の C 構造体である RPython レベルの AST ノードを返します。翻訳者は、関数が呼び出されたときに結果を返すために、Python インタープリターでこれを表現する方法を知りません。

C では、main() 関数は整数のみを返すことができます。pypy では、対話型トランスレータは文字列、int、float、およびタプルを渡したり返したりできます。ast ノードを処理し、基本型を返す必要があります。

于 2011-03-04T14:20:35.673 に答える
3

これは非常に具体的な pypy 関連の質問であり、irc.freenode.net の #pypy で回答を得るか、pypy-dev で質問する可能性が高くなります。

とはいえ、そのためにインタラクティブな翻訳を使用するべきではありません (とりわけ、非常識なデフォルトがあります)。代わりに、ターゲットを作成し (translator/goal/targetnopstandalone.py を例として参照)、translate.py を使用してコンパイルする必要があります。

于 2011-03-04T13:34:41.443 に答える