跳转到主要内容

Grako++是Grako的packrat解析器运行时,用C++编写。

项目描述

工作正在进行中!

Build Status

Grako++

Grako++是Grako的packrat解析器运行时,用C++编写。目标是提供与Grako兼容的解析器生成器,但性能优于Python。

与Grako的不同之处

  • 输出始终为AST/JSON。

  • 语义类可以用C++或Cython实现(通过Cython计划支持纯Python)。

  • 正则表达式语法是ECMAScript,而不是Python。

  • Grako的一些功能缺失,请见下面的TODO部分。

  • 状态类型必须实现operator<以用于std::map(为了未来的灵活性,也考虑实现hash trait)。

构建

该库目前只包含头文件,因此您可以将include/中的文件复制到方便的位置,或从那里构建。更正式地说,您可以使用cmake。

通过以下命令使用clang构建:cmake -DCMAKE_CXX_COMPILER=/path/to/clang++

使用g++ < 4.9构建需要链接到boost_regex库,因为std::regex实现有误。您可以使用导出的cmake库文件来配置正确的设置。

其他有用的选项:-DCMAKE_INSTALL_PREFIX:PATH=/path/to/install

用法

grakopp 程序用于像 grako 一样将 PEG 文件编译成源代码。可以使用 -f/–format 选项指定四种不同的源代码输出格式

–format

–output

目的

hpp

name.hpp

C++声明

cpp

name.cpp

C++实现

pxd

name.pxd

Cython声明

pyx

name.pyx

Cython实现

对于纯 C++ 解析器,生成 hpp 和 cpp 文件就足够了。对于 Python 集成,还需要 pxd 和 pyx 文件。对于“name”,您应替换实际的解析器名称(无论是 PEG 文件的基准名称还是 –name 选项的参数)。目前,文件名是硬编码到源文件中的(下划线保护 C++ 实现免受 Cython 生成的源文件的影响)。

以下是一个构建解析器的示例

$ ./grakopp -f hpp -o _basic.hpp tests/basic/basic.peg
$ ./grakopp --whitespace="" --no-nameguard -f cpp -o _basic.cpp tests/basic/basic.peg
$ g++ -DGRAKOPP_MAIN -std=c++11 -Iinclude -O4 -o basic _basic.cpp -lboost_regex

您可以将解析器调用得像用 grako 生成的 Python 解析器一样(目前不支持选项,除了内部选项 –test,该选项将 AST 与文本测试文件比较)

$ echo -n e1e2 | ./basic /dev/stdin sequence
[
    "e1",
    "e2"
]

C++ 接口

存在以下头文件

头文件

目的

grakopp/exception.hpp

解析器异常

grakopp/buffer.hpp

I/O 缓冲区

grakopp/ast.hpp

AST 实现

grakopp/parser.hpp

解析器基类

grakopp/grakopp/hpp

包含所有上述文件

grakopp/ast-io.hpp

可选 AST 流 I/O

Python 集成

在 Python 软件包准备就绪之前,手动构建 Cython 扩展,例如如下

$ cd python/grakopp
$ cython --cplus buffer.pyx
$ cython --cplus ast.pyx
$ g++ -std=c++11 -I../../include -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o buffer.so buffer.cpp
$ g++ -std=c++11 -I../../include -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o ast.so ast.cpp
$ cd ../..

继续上述示例

$ ./grakopp -f pxd -o basic.pxd tests/basic/basic.peg
$ ./grakopp -f pyx -o basic.pyx tests/basic/basic.peg
$ cython -Ipython --cplus basic.pyx
$ g++ -std=c++11 -Iinclude -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o basic.so basic.cpp _basic.cpp -l boost_regex

然后您可以从 Python 使用它

$ PYTHONPATH=python python
>>> from grakopp import buffer
>>> b = buffer.PyBuffer()
>>> b.from_string("e1e2")
>>> import basic
>>> p = basic.basicPyParser()
>>> p.set_buffer(b)
>>> a = p._sequence_()
>>> a.to_python()
['e1', 'e2']
>>> b.pos
4
>>> a = p._sequence_()
>>> a.to_python()
FailedToken('e1')

待办事项

  • 动态 Ast 对象(因此您可以通过 Python 或 XML 对象传递)

  • python/distutils 集成

  • 类似于 pyximport 的自动编译

  • 添加命名空间

  • Unicode 支持?

  • 更多对状态解析的支持和测试

  • 正则表达式语法测试(确保生成的 C 字符串始终正确)

  • 分析和优化

Grako 缺少的特性

  • ignorecase(缓冲区匹配,匹配re)

  • 跳过注释

  • 缓冲区行解析和跟踪输出(也在异常中)

  • ParseInfo

  • 带参数的规则

  • 左递归

  • 语义操作“_default”

作者

Copyright (C) 2014 semantics Kommunikationsmanagement GmbH
Written by Marcus Brinkmann <m.brinkmann@semantics.de>
See LICENSE.txt for details.

项目详情


下载文件

下载适合您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

grakopp-0.1.0.tar.gz (62.3 kB 查看哈希

上传时间 源代码

构建分发

grakopp-0.1.0.linux-x86_64.tar.gz (285.3 kB 查看哈希

上传时间 源代码

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误记录 StatusPageStatusPage 状态页面