Поддерживать номера строк Python при переводе в Dart

Мой проект, который можно найти на Проект Медуза стремится запустить Python намного быстрее, скомпилировав его в Dart и запустив на виртуальной машине Dart. Все хорошо, и я достигаю повышения скорости до 1500% по сравнению с обычной реализацией CPython.

Моя следующая цель — предоставить механизм сообщения об ошибках для проекта. Когда код Python компилируется в оптимизированный и сжатый код Dart, все номера строк и связанная с ними информация отладки теряются. Таким образом, во время выполнения, если где-то что-то идет не так, ошибка возникает из-за виртуальной машины Dart, и, как и ожидалось, виртуальная машина сообщает об ошибках в столбце Line: в сгенерированном файле Dart. То, что я хочу, это способ указать на ошибку в соответствующей строке файла Python.

В настоящее время я перевожу код Python в Dart, используя класс NodeVisitor, предоставленный модулем ast. Я посещаю каждый узел в AST и генерирую код Drat для этого узла. Я в курсе, как сохранить номера строк, где я получил код Python. Должен ли я пойти для таблицы символов отладки, как реализация, которую компиляторы C / C ++ используют для целей отладки, или я должен пойти для рукописного парсера?

Образец перевода:

Код Python:

a = input("Enter a number: ")
b = input("Enter another number: ")

print a + b
print a - b
print a * b
print a / b

Соответствующий код дротика:

import'file:///C:/Users/Rahul/.medusa/lib/inbuilts.dart';import'dart:io';var a,b;main(){a=input(str('Enter a number: '));b=input(str('Enter another number: '));stdout.writeln((a+b));stdout.writeln((a-b));stdout.writeln((a*b));stdout.writeln((a/b));}

Предположим, что если b здесь равно 0, я хочу, чтобы ошибка показала, что если это произошло в строке 7 файла Python, а не в 1: 245 файла Dart.

Спасибо!

1

Решение

JavaScript принял исходные карты именно по этой причине: HTML5Rocks

Это не идеальный формат, но он, вероятно, сработает здесь.

Sidenote: Dart VM пока не поддерживает исходные карты. Таким образом, вам нужно будет проанализировать трассировки стека (посмотрите на пакет stack_trace для кода, который делает это), а затем сопоставить местоположения обратно.

2

Другие решения

Ведение номеров строк будет очень трудным, потому что могут быть дополнительные операторы или операторы, которые могут быть лучше написаны в Dart и, следовательно, могут изменить номер строки, поэтому использование строк Dart не поможет вам.

Прежде всего, почему вы переводите код в одну строчку дротиков?

Лично я бы ловил ошибки и перебрасывал ошибки соответствующими номерами строк из python.

С уважением
Роберт

0

По вопросам рекламы [email protected]