Grako ++是一个用C++编写的Grako的PIDRAT解析器运行时。
grakopp的Python项目详细描述
正在工作!
Grako++
GraOK++是Grako的PcPATRAR解析器运行时,用C++编写。目标 是提供一个与grako兼容的解析器生成器,但是 性能优于python。
与Grako的差异
- 输出总是ast/json。
- 正则表达式语法是 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 | –output | Purpose |
---|---|---|
hpp | name.hpp | C++ declaration |
cpp | name.cpp | C++ implementation |
pxd | name.pxd | Cython declaration |
pyx | name.pyx | Cython implementation |
下面是一个如何构建解析器的示例:
$ ./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>
存在以下标题文件:
Header | Purpose |
---|---|
grakopp/exception.hpp | Parser exceptions |
grakopp/buffer.hpp | Buffer for I/O |
grakopp/ast.hpp | AST implementation |
grakopp/parser.hpp | Parser base class |
grakopp/grakopp/hpp | Include all above |
grakopp/ast-io.hpp | Optional 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”