在转换为Dart时保持Python行号

时间:2014-05-30 02:07:36

标签: python c++ compiler-construction dart vm-implementation

我可以在The Medusa Project找到的项目旨在通过将其编译为Dart并在Dart虚拟机上运行来更快地运行Python。一切都很好,我通过CPython实现的速度提升了1500%。

我的下一个目标是为项目提供错误报告机制。当Python代码被编译为优化和压缩的Dart代码时,所有行号和相关的调试信息都将丢失。因此,在运行时,如果出现错误,Dart VM会出现错误,并且正如预期的那样,VM会在生成的Dart文件中的Line:Column中报告错误。我想要的是一种在Python文件的相应行中指出错误的方法。

目前,我正在使用ast模块提供的NodeVisitor类将Python代码转换为Dart。我访问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,我希望错误显示如果发生在Python文件的第7行而不是Dart文件的1:245。

谢谢!

2 个答案:

答案 0 :(得分:2)

JavaScript正是出于这个原因采用了源地图:html5rocks

这不是一个完美的格式,但它可能会在这里完成工作。

旁注:Dart VM尚不支持源地图。因此,您需要解析堆栈跟踪(请查看执行此操作的代码的stack_trace package),然后将位置映射回来。

答案 1 :(得分:0)

维护行号将非常困难,因为可能有更多的语句或语句可以在Dart中更好地编写,因此会更改行号,因此使用Dart行不会对您有所帮助。

首先,为什么要将代码翻译成一个单一的飞镖线?

我个人会抓住错误并用python中的相应行号重新抛出错误。

此致 罗伯特