Grako++是Grako的packrat解析器运行时,用C++编写。
项目描述
工作正在进行中!
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”
项目详情
下载文件
下载适合您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分发
构建分发
grakopp-0.1.0.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4d3b2892e5e8494dc773cc7d26a3396b92bb4e8d7c42f99f981b6140e7fbc2f6 |
|
MD5 | ee931d383d83a66bf88785360a519eee |
|
BLAKE2b-256 | 2ceda47e685b29ada7e1435b0d13eb4044f731bbdcba3f0fbe52ddba079dd1c7 |
grakopp-0.1.0.linux-x86_64.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8f1f8a7fe69f13f739cfa358cb7674f55df6db8ba5059525ba16486da488df2a |
|
MD5 | b647fff80f0f1ab584f6e832802f014b |
|
BLAKE2b-256 | 569e902734185b8c8e8c4c6f34f0e1f2152f77498c9b396beccd62670366bc7b |