Project

packcr

0.0
No release in over a year
Parser generator for C or Ruby
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 13.0
~> 3.12
~> 1.43.0
 Project Readme

PackCR

Overview

PackCR is a parser generator for C or Ruby. This library is a port of PackCC rewritten in ruby. The Original PackCC is https://github.com/arithy/packcc.

Usage

You can get Packcr object with Packcr.new(peg_path) and it can generate C source and header with Packcr#run.

Example(1):

$ cat ./tmp/example1.sh
#!/bin/sh
set -e
cd $0/..
cp ../packcc/examples/calc.peg calc.c.peg
bundle exec ruby -e 'require "packcr"; Packcr.new("calc.c.peg").run'
gcc calc.c
echo "1 + 2 * 3 - 4 / 2" | ./a.out

$ ./tmp/example1.sh
answer=5

Example(2):

$ cat ./tmp/example2.sh
#!/bin/sh
set -e
cd $0/..
cp ../examples/calc.rb.peg .
bundle exec ruby -e 'require "packcr"; Packcr.new("calc.rb.peg").run'
ruby calc.rb "1 + 2 * 3 - 4 / 2"

$ ./tmp/example2.sh
answer=5

Syntax

The syntax is almost the same as PackCC. Additional syntax is shown below.

%location { source code }

It defines your own location structure. It should have some definitions for C:

  • struct
    • packcr_location_t
  • function
    • void packcr_location_init(packcr_location_t *lp)
    • void packcr_location_forward(packcr_location_t *lp, char *buf, size_t n)
    • packcr_location_t packcr_location_add(packcr_location_t l1, packcr_location_t l2)
    • packcr_location_t packcr_location_sub(packcr_location_t l1, packcr_location_t l2)
    • (The functions can be static and/or inline)

Or it should have some definitions for ruby:

  • class
    • Location
  • method
    • Location#initialize(...)
    • Location#+(loc)
    • Location#-(loc)
    • Location#forward(str, index, n)

Locations are captured and they can be refer with $nsl and $nel. You can see the examples examples/calc_loc.peg and examples/calc_loc.rb.peg.