Grako ++是一个用C++编写的Grako的PIDRAT解析器运行时。

grakopp的Python项目详细描述


正在工作!

Build Status

Grako++

GraOK++是Grako的PcPATRAR解析器运行时,用C++编写。目标 是提供一个与grako兼容的解析器生成器,但是 性能优于python。

与Grako的差异

  • 输出总是ast/json。
  • 语义类可以用C++或Cython实现(纯Python) 计划通过cython)。
  • 正则表达式语法是 ECMAScript, 不是Python。
  • 缺少grako的一些特性,请参见下面的todo部分。
  • 状态类型必须实现std::map的运算符<;以备将来使用 灵活性,也要考虑实现哈希特性。

建造

库当前只是头文件,因此您可以只复制 文件包含在/到一个方便的位置,或从那里构建。更多 正式地说,你可以使用cmake。

通过调用:cmake-dcmake_cxx_compiler=/path/to/clang++

使用g++<;4.9构建需要与boost\u regex库链接, 因为std::regex实现已损坏。你可以依靠 导出cmake库文件以配置正确的设置。

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

使用量

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

–format–outputPurpose
hppname.hppC++ declaration
cppname.cppC++ implementation
pxdname.pxdCython declaration
pyxname.pyxCython implementation
对于纯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解析器一样调用解析器 (不过,目前不支持任何选项,除了内部 option–将ast与文本fixture文件进行比较的测试:

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

C++接口< EH3>

存在以下标题文件:

HeaderPurpose
grakopp/exception.hppParser exceptions
grakopp/buffer.hppBuffer for I/O
grakopp/ast.hppAST implementation
grakopp/parser.hppParser base class
grakopp/grakopp/hppInclude all above
grakopp/ast-io.hppOptional AST stream 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集成
  • 自动编译LyPyxPix
  • 添加命名空间
  • Unicode支持?
  • 对有状态解析的更多支持和测试
  • 正则表达式语法测试(确保生成的C字符串始终正确)
  • 配置和优化

缺少Grako功能:

  • ignorecase(缓冲区匹配,匹配re)
  • 评论跳过
  • 缓冲线分析和跟踪输出(也在例外情况下)
  • 解析信息
  • 带参数的规则
  • 左递归
  • 语义动作“_default”

作者

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

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

推荐PyPI第三方库


热门话题
java将Int值传递给另一个类   在使用Sdin(或非交互式)输入| Java时调试奇怪的输入错误   java返回一个文本字符串作为响应struts2   java为什么我们不能在声明局部变量之前初始化它呢?   java从现有XML中读取值并将其填充到Json中   java Spring Boot+Maven:找不到repositoryFactoryBean   java使用regex表示“W o.Rd”。replaceAll(“单词”、“替换”)   java Sub resorce在Jersey REST API框架中不起作用   java在组件启动时,当所述报告存储在Sharepoint中时,是否可以加载预格式化的WebDataRocks报告?   java并发更新列表的最佳方法   servlets Java web应用程序对象调度   应用程序在点击按钮时崩溃,Android Studio(Java)   java如何为掷骰子游戏调用另一个类中的方法?