Как добавить возможности Traceback / отладки на язык, реализованный в Python?

StackOverflow https://stackoverflow.com//questions/9633363

Вопрос

Я использую Python для реализации другого языка программирования с именем «FO». Все код FOO будет переведен на Python, и также будет работать в том же интерпретатеке Python, поэтому он будет записывать в Python.

Вот небольшой кусок кода Foo:

function bar(arg1, arg2) {
    while (arg1 > arg2) {
        arg2 += 5;
    }
    return arg2 - arg1;
}
.

Что будет перевести на:

def _bar(arg1, arg2):
    while arg1 > arg2:
        arg2 += 5
        watchdog.switch()
    watchdog.switch()
    return arg2 - arg1
.

«WatchDog» - это зеленое лето (сгенерированный код также работает в контексте Greenlet), который будет мониторировать / ограничивать использование ресурсов, поскольку язык будет запущен ненадежным кодом.

Как видно в примере, до того, как генерируется Python код, небольшие изменения будут внесены в дереве разбора, чтобы добавить переключатели Watchdog и внести небольшие изменения в идентификаторы функций.

Чтобы удовлетворить все препросматривать, я также должен добавить возможности Traceback / отладки на язык на язык, так что, когда во время выполнения Python выбрасывает исключение, то, что пользователь увидит, что код TRACESBACK IS FOO (как описано для отображения сгенерированного Traceback Code Python ).

Подумайте, что пользователь создает файл с именем «Program.foo» со следующим содержимым:

1  function bar() {
2      throw Exception('Some exception message');
3  }
4
5  function foo() {
6      output('invoking function bar');
7      bar();
8  }
9
10 foo();
.

Что будет перевести на:

def _bar():
    watchdog.switch()
    raise Exception('Some exception message')

def _foo():
    print 'invoking function bar'
    watchdog.switch()
    _bar()

watchdog.switch()
_foo()
.

Тогда выход «Program.foo» должен быть что-то вроде:

invoking function bar
Traceback (most recent call last):
  File "program.foo", line 10
    foo();
  File "program.foo", line 7, inside function 'foo'
    bar();
  File "program.foo", line 2, inside function 'bar'
    throw Exception('Some exception message');
Exception: Some exception message
.

Есть ли простой способ сделать это? Я бы предпочел решение, которое не связано с инструментами Python Bytecode, поскольку он является внутренним для реализации интерпретатора, но если нет ничего другого, то применные Bytecode также сделают это.

Это было полезно?

Решение

You could decorate each generated Python function with a decorator which record the context (filename, function, line number, etc.) to a global stack. Then you could derive your own Exception class and catch it at the top level of the interpreter. Finally, you print out what you like, using information from the global debug stack.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top