私は楽しみのために、python ベースの DSL を作成しています。現時点では、Python コードを直接実行する AST にテキストをコンパイルするだけです。つまり、次のように記述します。
a = int(read("input something: "))
b = a**2
これを次のようなツリーに変換します。
Program:
VariableSet a:
Call:
VariableGet int
Call:
VariableGet read
Literal("input something: ")
VariableSet b:
BinaryExpession **:
VariableGet a
Literal(2)
これらの各ノードは、次のようなコードで実行されます。
class VariableSet(object):
def __init__(self, name, expr):
self.name = name
self.expr = expr
def __call__(self, scope):
value = self.expr(scope)
scope.put(self.name, value)
return value
それは非常にうまく機能します。一部の命令が例外をスローしたときに、例外スタックのトレースバックが python AST コードではなく DSL ソース コードを指すようにしたかったのです。今、私が見るのは次のとおりです。
Traceback (most recent call last):
File "parser.py", line 164, in <module>
parse(data)(scope)
File "/home/juanplopes/Projects/my-parser/ast.py", line 158, in __call__
result = expr(scope)
File "/home/juanplopes/Projects/my-parser/ast.py", line 63, in __call__
value = self.expr(scope)
File "/home/juanplopes/Projects/my-parser/ast.py", line 81, in __call__
return self.method(scope)(*[arg(scope) for arg in self.args])
File "/home/juanplopes/Projects/my-parser/ast.py", line 81, in __call__
return self.method(scope)(*[arg(scope) for arg in self.args])
File "parser.py", line 153, in read
raise Exception('some exception')
Exception: some exception
Pythonでトレースバックが生成される方法をカスタマイズする方法はありますか?