抽象语法树的生成器。

astgen的Python项目详细描述



astgen-生成抽象语法树的工具生成器)以记录解析阶段的结果。输入是Python类的一个集合,它描述了特定于分析器的AST类的方法和成员
,并输出了具有不同的
AST类的语言特定(迄今为止的Java和C++)类。
BR/>安装< BR/> -
BR/> ` BR/> PIP安装astgen
``

,或从github

````
git clone[git repo url]astgen
cd astgen
python setup.py install
```


getting started
--

安装后,将创建名为"astgen"的脚本。要查看其用法,请使用-h选项调用它:

```
bash-3.2$astgen-h
用法:astgen[options]

options:
-h,--help显示此帮助消息并退出
-o outputdir,--outputdir=outputdir
写入所有生成文件的输出文件夹。
-l layout_backend,--layout_backend=layout_backend
决定代码包布局的后端
生成的(如单文件、多文件等):BR/> -P平台后端,-PrimFieldBe后端=PrimFrimeBe后端:BR/>后端,帮助平台实现目标代码:BR/>生成器(如Java、Python、STL、C等)BR/> -C BueDeNeX-CONFIG,--data=backend_config
数据需要任何可以使用/传递到平台或布局后端的自定义数据。
-m model_file,--modelfile=model_file
包含AST定义的输入模型文件
AST-代码将被生成。
‘BR/> BR/> BR/>强制MODEL文件和BueDeNo.CONFIG参数是必需的,而平台参数默认为C++(即输出是C++类),并且使用两个文件布局,其中所有的节点声明都写入头(h)文件。定义被写入实现文件(.cpp)。


sample usage

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————与/tmp/calculator文件夹中的示例关联的各种ast节点的文件


models
----


models定义要生成的ast节点的结构。一个模型类似于:

```
类nodeClass(astnode):
properties=dict(member1=membertype1,
member2=membertype2,…)
````


节点也可以从其他定义的节点继承,例如:

````

operator=enumtype("operator","plus"、"minus"、"mul"、"div")


类表达式(astnode):pass


Class BinaryExpression(expression):
"
"有一个二进制运算符和左右子表达式。
"
"properties=dict(op=operator,
lhs="expression",
rhs="expression")


类一元表达式(表达式):
"
"有前缀运算符和表达式
"
"properties=dict(op=operator,
child="expression")
```


下一节将讨论类型。

config
----

config文件(用-c参数指定)包含生成ast代码时astgen的各个部分使用的重写和其他数据。不同的参数取决于所用的布局和平台后端,并将被描述在各个部分中,讨论了节点和属性。每个属性都必须有一个类型。属性的类型值可以是一个字符串,表示对另一个定义类的值的引用(在上面的情况下是"表达式"),也可以是以下类型之一:



通过platformbackend对象。例如:
BR/>‘BR/>整型= BasicType("int")
‘BR/>< BR/>定义了一种称为整数的类型,它是"int"类型,可以等于C/C++或Java中的int变量。

请注意,这并不意味着只能用这种方式定义基元类型。BasicType的使用只是暗示底层类型(及其在最终输出中呈现的字符串表示)由PlatformBackend决定。STD:BR/> > BR/>‘Boo/Point’ListTpTr= Basic类型(Point TistPPTR)
‘BR/> BR/>,作为回报,可以将(C++)作为:
BR/>‘BR/> STD::SyrdYPPTR & lt;STD::List& Lt:Point & Gt;
```

platformbackend部分将讨论如何解析这些类型。


枚举3

}
````

在C++中,这将类似于:TyBuffsSTD::对和lt;Type 2& Gt;TypeName
'BR/> BR/>如果没有指定类型名,则自动生成和使用名称。
BR/>价值观。在C++中,这将类似于:TyBuffsSTD::List.lt;Type 1,Type 2& Gt;TypeName
'BR/> BR/>如果未指定类型名,则自动生成并使用名称。
BR/>α-PyOp>(KyType,ValueType)

< BR/>定义了一个类型,即具有键和值的映射。分别由keytype和valuetype给定的类型。在C++中,这将类似于:
‘BR/> TyBuffsSTD::map & lt;KyType,ValueType & TypeName;自动生成和使用名称。
BR/>平台
----BR/> BR/>平台对象负责处理和委派与AST正在生成的特定平台相关的所有关注(如C++、Java等)。目前,平台对象只提供一个方法:

```
def evaltype(self,typeobj):pass
````

此方法负责返回特定于平台的类型对象的字符串表示(如类型部分中讨论的)。为了实现上述结果,astgen.platforms.cpluplus后端看起来如下:

`````
类cplus(astgen.astporm):
def evaltype(self,Type Objy:By/Objy:Br/Objy:Br/>"pTR"
ELIF类型(Type Objo)是AtGEN。BasicType:
如果Type Obj.Type Ne= ="布尔":返回"BoOL"
如果Type Obj.Type Ne= ="String":返回"STD::String"
返回类型STD:BR/> ElIF类型(Type Objo)是ASTGEN。List::Br/>返回:"STD::%s& gt;"%Audio(Type Obj.BaseType):BR/> ELIF类型(Type Objo)是AtGEng.配对:
返回"STD::配对和%s,%s&gt;"%(自.EngRype(Type Obj.Type 1),AbGy.MyoF:BR/> ElFIN类型(Type Objo)是AtGEn.Mabof:
返回"STD::MAP & LT;%s,%s&gt;"%(自.EngRead(Type Obj.Kype类型),By.EngRype(Type Obj.ValueSype类型))
ELIF类型(Type Objo)是AtGEG. EnumType:
返回类型bj.enum_name
return super(cpluplus,self).evaltype(typeobj)
`````

>可以使用-p参数向astgen脚本提供自定义平台后端。

它可以在CONFIG(.Py)文件中定义。有几种方法可以布局生成节点。例如,对于C++来说,下面的(还有几个)布局是可能的:

-单头文件:一个包含所有类定义及其实现的单个.h文件.BR/> -两个文件:分解成一个头文件(包含所有接口/类)声明)和一个实现文件(包含所有类/实现定义)。
-每个类有两个文件:每个类有自己的头和实现文件。

根据项目的需要,可以有其他几种布局。所有这些布局都继承自astlayout基。astlayout基有以下方法:

```
类astlayout(对象):
""
给定一个ast节点将生成该节点的代码。这可用于
为不同语言或平台生成ast代码。
"


def order nodes(self,nodes):
"
"调用以任何必要的方式订购所有节点。
"
"pass


def generationstarted(self,nodelist):
"
在开始为任何节点生成节点之前调用。
""传递


def generationfinished(self,nodelist):
""在所有节点的代码生成完成之后调用。
""
"pass

def nodestarted(self,node):
"
"在生成特定节点的代码之前调用。
"
"pass


def render nodes(self,nodelist):
"
调用以呈现所有节点传递

def render node(self,node):
"
"调用以呈现特定节点。
"
"传递


def nodefinished(self,node):
"
"在为特定节点生成代码后调用。
"
"pass

```


下面是迄今为止定义的laout类(以及它们在配置文件中接受的参数):


astgen.layouts.one file layout

可接受配置文件中的以下选项:

-header_output:所有类将写入的输出文件。
-header_template:将用于呈现所有类的(jinja2)模板文件(默认为"cpp_header")。

#####astgen.layouts.two files layout

两个文件布局,其中所有类接口声明都写入头,实现/定义都写入实现文件(例如.cpp、.m等)。可接受配置文件中的以下选项:

-header_output:将所有类声明写入的输出文件。
-header_template:将用于呈现所有类的(jinja2)模板文件(默认为"cpp_header")。
-实现输出:所有类定义/实现将写入的输出文件。
-实现模板:将用于呈现所有类实现/定义的(jinja2)模板文件(默认为"cpp_实现")。

#####astgen.layouts.twofilespernodelayout

在这个布局中,每个节点都被写入自己的文件(典型的
<;nodename>;.h和<;nodename.cpp>;)。此外,还将生成一个转发defs文件、一个
公共头文件和一个所有枚举的头文件。
这些文件由以下项表示:

-fwdefs_output:将所有转发定义写入的输出文件(可选)。
-enums_output:其中写入了所有枚举(可选)。
-public_output:所有包含头的输出文件(可选)。

-fwdefs_template:将用于呈现转发定义(如果使用)的(jinja2)模板文件。
-enums_template:将用于呈现枚举定义的(jinja2)模板文件(如果使用)。
-public\u模板:将用于呈现公共头的(jinja2)模板文件包括(如果使用)。

(对于Java的BR/>实例,不需要上面的任何一个)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将长字符串转换为短得多的字符串   java类型ArrayList<Boolean>中的toArray(T[])方法不适用于参数(Boolean[])   java xfire webservice客户端获取空响应   java软件框架和软件平台有什么区别?   java构建了一个监听数据库更改并调用其他方法的软件。我做得对吗?   安卓 studio(java)中的Paypal:与服务器通信的问题   我们如何在运行时更改java提供的内置注释的消息   java成批进行http调用   序列化   当我使用Tomcat运行我的应用程序时,我得到了java。网MalformedURLException:本地主机名未知:java。网未知后异常   操作系统Java内存映射文件和刷新   java无法用v6构建JXBrowser jar。18+   java有没有办法从运行在同一台服务器上的代码中获取服务器指纹?   使用“代理”用户的java Spring Active Directory身份验证   在Android(Kotlin/Java)活动之间发送图像   java显示ArrayList对象?