Skip to content

Commit

Permalink
+ A few ways of making parlset parsers modular.
Browse files Browse the repository at this point in the history
  • Loading branch information
kschiess committed Mar 25, 2012
1 parent 90ac079 commit ef7dc56
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions example/modularity.rb
@@ -0,0 +1,47 @@
$:.unshift File.dirname(__FILE__) + "/../lib"

require 'pp'
require "parslet"

# Demonstrates modular parsers, split out over many classes. Please look at
# ip_address.rb as well.

module ALanguage
include Parslet

# Parslet rules are really a special kind of method. Mix them into your
# classes!
rule(:a_language) { str('aaa') }
end

# Parslet parsers are parslet atoms as well. Create an instance and chain them
# to your other rules.
#
class BLanguage < Parslet::Parser
root :blang

rule(:blang) { str('bbb') }
end

# Parslet atoms are really Ruby values, pass them around.
c_language = Parslet.str('ccc')

class Language < Parslet::Parser
def initialize(c_language)
@c_language = c_language
super()
end

root :root

include ALanguage

rule(:root) { str('a(') >> a_language >> str(')') >> space |
str('b(') >> BLanguage.new >> str(')') >> space |
str('c(') >> @c_language >> str(')') >> space }
rule(:space) { str(' ').maybe }
end

Language.new(c_language).parse('a(aaa)')

This comment has been minimized.

Copy link
@floere

floere Mar 26, 2012

Contributor

It might be a good idea to add the expected output as well, in a comment. Even though the idea is to run the example, with a comment I can also view the examples online and get what it is about.

This comment has been minimized.

Copy link
@kschiess

kschiess Mar 27, 2012

Author Owner

The idea in this example is not to run it, but to study it. It produces no output.

This comment has been minimized.

Copy link
@floere

floere Mar 27, 2012

Contributor

Output of the lines I am specifically commenting on - this usually helps me when studying code.

This comment has been minimized.

Copy link
@floere

floere Mar 27, 2012

Contributor

some statement # => some result is what I meant.

This comment has been minimized.

Copy link
@kschiess

kschiess Mar 27, 2012

Author Owner

And what is it that you're proposing? The three lines here have only very unspectacular results... The real result is that they consume input and don't raise.

This comment has been minimized.

Copy link
@kschiess

kschiess Mar 27, 2012

Author Owner

Also, for more explanation see the mailing list.

This comment has been minimized.

Copy link
@floere

floere Mar 27, 2012

Contributor

I simply proposed this:
Language.new(c_language).parse('a(aaa)') # => '"a(aaa)"@0'

This is spectacular enough for me, especially in this example – it tells me that it works! (Where exactly is your information about the "real result" encoded anyway? ;) )

Language.new(c_language).parse('b(bbb)')
Language.new(c_language).parse('c(ccc)')
Empty file added example/output/modularity.out
Empty file.

0 comments on commit ef7dc56

Please sign in to comment.