Giter Club home page Giter Club logo

lrama's Introduction

Lrama

Gem Version build RubyDoc

Lrama is LALR (1) parser generator written by Ruby. The first goal of this project is providing error tolerant parser for CRuby with minimal changes on CRuby parse.y file.

Features

  • Bison style grammar file is supported with some assumptions
    • b4_locations_if is always true
    • b4_pure_if is always true
    • b4_pull_if is always false
    • b4_lac_if is always false
  • Error Tolerance parser
  • Parameterizing rules
    • The definition of a non-terminal symbol can be parameterized with other (terminal or non-terminal) symbols.
    • Providing a generic definition of parameterizing rules as a standard library.
  • Inlining
    • The %inline directive causes all references to symbols to be replaced with its definition.
    • Resolve shift/reduce conflicts without artificially altering the grammar file.

Installation

$ gem install lrama

From source codes,

$ cd "$(lrama root)"
$ bundle install
$ bundle exec rake install
$ bundle exec lrama --version
0.5.0

Usage

# "y.tab.c" and "y.tab.h" are generated
$ lrama -d sample/parse.y
# "calc", "calc.c", and "calc.h" are generated
$ lrama -d sample/calc.y -o calc.c && gcc -Wall calc.c -o calc && ./calc
Enter the formula:
1
=> 1
1+2*3
=> 7
(1+2)*3
=> 9

Versions and Branches

v0_6 (master branch)

This branch is for Ruby 3.4. lrama_0_6 branch is created from this branch, once Ruby 3.4 is released.

v0_5 (lrama_0_5 branch)

This branch is for Ruby 3.3.

v0_4 (lrama_0_4 branch)

This branch generates "parse.c" compatible with Bison 3.8.2 for ruby 3.0, 3.1, 3.2. The first version migrated to ruby is "0.4.0" therefore keep this branch for Bison compatible branch.

Supported Ruby version

Lrama is executed with BASERUBY when building ruby from source code. Therefore Lrama needs to support BASERUBY, currently 2.5, or later version.

This also requires Lrama to be able to run with only default gems because BASERUBY runs with --disable=gems option.

Development

How to generate parser.rb

$ bundle exec rake build:parser

parser.rb is generated from parser.y by Racc. Run the rake command when you update parser.y then commit changes of both files.

Test

Running tests:

$ bundle install
$ bundle exec rspec
# or
$ bundle exec rake spec

Running type check:

$ bundle install
$ bundle exec rbs collection install
$ bundle exec steep check
# or
$ bundle exec rake steep

Running both of them:

$ bundle install
$ bundle exec rake

Call-stack Profiling Lrama

1. Create parse.tmp.y in ruby/ruby

$ ruby tool/id2token.rb parse.y > parse.tmp.y
$ cp parse.tmp.y dir/lrama/tmp

2. Enable Profiler

diff --git a/exe/lrama b/exe/lrama
index ba5fb06..2497178 100755
--- a/exe/lrama
+++ b/exe/lrama
@@ -3,4 +3,6 @@
 $LOAD_PATH << File.join(__dir__, "../lib")
 require "lrama"

-Lrama::Command.new.run(ARGV.dup)
+Lrama::Report::Profile.report_profile do
+  Lrama::Command.new.run(ARGV.dup)
+end

3. Run Lrama

$ exe/lrama -o parse.tmp.c --header=parse.tmp.h tmp/parse.tmp.y

4. Generate Flamegraph

$ stackprof --d3-flamegraph tmp/stackprof-cpu-myapp.dump > tmp/flamegraph.html

Memory Profiling Lrama

1. Create parse.tmp.y in ruby/ruby

$ ruby tool/id2token.rb parse.y > parse.tmp.y
$ cp parse.tmp.y dir/lrama/tmp

2. Enable Profiler

diff --git a/exe/lrama b/exe/lrama
index 1aece5d141..f5f94cf7fa 100755
--- a/exe/lrama
+++ b/exe/lrama
@@ -3,5 +3,9 @@

 $LOAD_PATH << File.join(__dir__, "../lib")
 require "lrama"
+require 'memory_profiler'

-Lrama::Command.new.run(ARGV.dup)
+report = MemoryProfiler.report do
+  Lrama::Command.new.run(ARGV.dup)
+end
+report.pretty_print

3. Run Lrama

$ exe/lrama -o parse.tmp.c --header=parse.tmp.h tmp/parse.tmp.y > report.txt

Build Ruby

  1. Install Lrama
  2. Run make main

Release flow

  1. Update Lrama::VERSION and NEWS.md
  2. Release as a gem by rake release
  3. Update Lrama in ruby/ruby by cp -r LEGAL.md NEWS.md MIT exe lib template ruby/tool/lrama
  4. Create new release on GitHub

License

See LEGAL.md file.

lrama's People

Contributors

yui-knk avatar ydah avatar junk0612 avatar little-rubyist avatar alitaso345 avatar nobu avatar maumagnaguagno avatar lucasmenezesds avatar makenowjust avatar mame avatar akouryy avatar jinroq avatar hsbt avatar koic avatar s-h-gamelinks avatar m-nakamura145 avatar kaiquekandykoga avatar dependabot[bot] avatar gemmaro avatar ima1zumi avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.