2014-12-03 86 views
2

我想构建一个领域特定语言作为Python的超集。像如何解析Python之上的领域特定语言?什么架构与IPython?

f7:10y=x^2 

设计成最小化打字密码命令应当被执行之前被解析成普通的Python

for k in range(7,10): 
    f[k].set_y(expr='x^2') 

。命令行界面可能是IPython。

什么是合适的体系结构:我应该在IPython命令行shell还是其内核守护程序中实现隐含到纯朴的Python转换?有没有有用的库/教程/例子?

或更一般地说:有没有例子说明如何向Python添加复杂的语法糖?

回答

1

,将工作无处不在一个解决方案是不是真的一个不错的选择。你试图实现的是修改Python解析器的核心。

的选项有:

  1. 使用预解析器。在IPython中有可用挂钩这一点:http://ipython.org/ipython-doc/dev/config/inputtransforms.html

    这里是为您的使用情况的一个例子:

    import re 
    
    range_search = re.compile(''' 
        (?P<variable>.+) 
        (?P<start>\d+):(?P<stop>\d+) 
        (?P<k>[^=]+)=(?P<v>.+) 
    ''', re.VERBOSE) 
    
    range_replace = '''for k in range(\g<start>, \g<stop>): 
        \g<variable>[k].set_\g<k>(expr='\g<v>')''' 
    
    print range_search.sub(range_replace, 'f7:10y=x^2') 
    
    @StatelessInputTransformer.wrap 
    def inline_loop(line): 
        return range_search.sub(range_replace, line) 
    
  2. 重新编译Python程序所做的修改

  3. 用途是在这方面更灵活的语言像红宝石

+0

我的应用程序上下文中排除了最后两个选项。我的意思是要求一个合适的预备人员,以及如何将其与IPython集成。 – 2014-12-03 16:59:52

+0

@JoachimWuttke:查看添加的示例 – Wolph 2014-12-03 17:34:15

1

与PyPy这是相当容易做到。您可以将一些东西添加到语法文件中,然后完成。

下面是一个例子:https://bitbucket.org/adonohue/units/src/bb1b20dd739f73fe495723d24cd266b67549f5c9/unitPython/patches?at=default

它允许units库做这样的事情:

print(2cm/0.5 s) 
-> 4.0 cm/s 
+0

谢谢@Wolph。看起来不错。现在让我等待我的问题的第2部分,是否有人可以就IPython集成提供建议。 PyPy会进入shell还是内核? – 2014-12-03 15:36:15

+0

虽然我没有测试过这个,但我会假设你可以在自定义Pypy安装中简单地安装IPython来完成这项工作。 – Wolph 2014-12-03 15:39:05

+0

现在我看到PyPy不在CPython之上,而是替代它,它会禁止其他自由度(例如,将某一天迁移到Cython)。因此,不完全是我所希望的解决方案。 – 2014-12-03 15:49:42