2010-08-17 62 views
4

我正在研究在Python之上实现的一个特定于领域的语言。语法和Python非常接近,直到现在我们只是进行了一些简单的字符串转换,然后将其输入到ast。例如,缩进被替换为#endfor/#endwhile/#endif语句,所以我们对缩进进行规范化,但它仍然是一个字符串。解析一个几乎是Python的语言的最佳方式?

我想知道是否有更好的方法?据我所知,ast是硬编码来解析Python语法,我真的找不到除http://docs.python.org/library/ast.html#module-ast(以及源自身,我想)以外的任何文档。

有没有人有PyParsing,ANTLR或PLY的个人经验?

有些模糊的计划将解释器重写为将我们的语言转换为有效的Python并将其提供给Python解释器本身的东西,所以我想要一些与compile兼容的东西,但这不是一个交易断路器。

更新:它只是发生,我认为

from __future__ import print_function, with_statement 

改变Python解析下列源的方式。但是,PEP 236表明这是编译器功能的句法窗口修饰。有人可以确认试图覆盖/扩展__future__是不是我的问题的正确解决方案?

+1

“编译器特性的句法窗口修饰”。这两个'__future__'模块实际上不是'模块'。它看起来像一个'import'语法,但它修改了正在使用的Python编译器。这不是一个合适的“进口”。这是魔法。 – 2010-08-17 19:16:58

回答

1

PLY的作品。这很奇怪,因为它模仿lex/yacc的方式不是非常pythonic。

lex和yacc都有一个隐式接口,可以将lex的输出作为独立程序运行。这个“功能”被仔细保存。类似于PLY的yacc-like特征。小心保留了创建奇怪的,隐含的独立主程序的“特征”。

但是,PLY as lex/yacc兼容工具集相当不错。你所有的lex/yacc技能都会保留下来。

[编辑评论。 “修复”Python的语法可能会浪费时间。几乎每个人都可以正确缩进,没有任何帮助。检查C,Java,C++甚至是Pascal代码,你会发现几乎每个人都可以很好地缩进。事实上,人们竭尽全力在Java不需要的地方缩进Java。如果缩进在Java中不重要,为什么人们做得这么好?]

+0

快速回复您的评论:您可能对缩进是正确的,但还有其他一些小小的偏差,其中许多更加合理,并且没有意见与我的老板争论缩进,只要我们仍然需要预处理源以处理其他偏差。 – Wang 2010-08-17 18:19:28

+3

@Wang:任何时候你认为你的问题都是通过DSL解决的,你有两个**问题。发明一种新的编程语言似乎是个好主意。在你遇到问题之前,你有两个级别的调试 - 你的新编程语言和你的底层框架/应用程序。祝你好运。 – 2010-08-17 19:14:19

相关问题