在python中为DSL编写编译器

too*_*php 6 python dsl dsl-tools

我正在用python编写一个游戏,并决定为地图数据文件创建一个DSL.我知道我可以用regex编写自己的解析器,但我想知道是否有现成的python工具可以更容易地做到这一点,比如在PHP引擎中使用的re2c.

一些额外的信息:

  • 是的,我确实需要DSL,即使我没有,我仍然需要在项目中构建和使用它的经验.
  • DSL只包含数据(声明?),它不会被"执行".大多数行看起来像:

    SOMETHING: !abc @123 #xyz/123

    我只需要阅读数据树.

Mat*_*vor 12

pyparsing给我留下了深刻的印象.作者Paul McGuire在python list/comp.lang.python上很活跃,并且对任何有关它的查询都非常有帮助.


S.L*_*ott 6

这是一种非常有效的方法.

abc= ONETHING( ... )
xyz= ANOTHERTHING( ... )
pqr= SOMETHING( this=abc, that=123, more=(xyz,123) )
Run Code Online (Sandbox Code Playgroud)

声明.易于解析.

和...

它实际上是Python.一些类声明和工作已经完成.DSL实际上是类声明.

重要的是DSL只是创建对象.定义DSL时,首先必须从对象模型开始.稍后,您在该对象模型周围添加了一些语法.您不是从语法开始,而是从模型开始.


Pio*_*cki 4

是的,有很多——太多了——解析工具,但标准库中没有一个。

据我所知,PLY 和 SPARK 很受欢迎。PLY类似于​​ yacc,但是您可以在 Python 中完成所有操作,因为您在文档字符串中编写语法。

就我个人而言,我喜欢解析器组合器的概念(取自函数式编程),而且我非常喜欢pyparsing:你直接用 python 编写语法和操作,而且很容易上手。我最终使用操作生成了自己的树节点类型,而不是使用它们的默认值ParserElement类型。

否则,您还可以使用现有的声明性语言,例如YAML