lib/parslet/parser.rb in parslet-1.1.1 vs lib/parslet/parser.rb in parslet-1.2.0
- old
+ new
@@ -10,8 +10,62 @@
#
# pp MyParser.new.parse('aaaa') # => 'aaaa'
# pp MyParser.new.parse('bbbb') # => Parslet::Atoms::ParseFailed:
# # Don't know what to do with bbbb at line 1 char 1.
#
-class Parslet::Parser
+# Parslet::Parser is also a grammar atom. This means that you can mix full
+# fledged parsers freely with small parts of a different parser.
+#
+# Example:
+# class ParserA < Parslet::Parser
+# root :aaa
+# rule(:aaa) { str('a').repeat(3,3) }
+# end
+# class ParserB < Parslet::Parser
+# root :expression
+# rule(:expression) { str('b') >> ParserA.new >> str('b') }
+# end
+#
+# In the above example, ParserB would parse something like 'baaab'.
+#
+class Parslet::Parser < Parslet::Atoms::Base
include Parslet
+
+ class <<self # class methods
+ # Define the parsers #root function. This is the place where you start
+ # parsing; if you have a rule for 'file' that describes what should be
+ # in a file, this would be your root declaration:
+ #
+ # class Parser
+ # root :file
+ # rule(:file) { ... }
+ # end
+ #
+ # #root declares a 'parse' function that works just like the parse
+ # function that you can call on a simple parslet, taking a string as input
+ # and producing parse output.
+ #
+ # In a way, #root is a shorthand for:
+ #
+ # def parse(str)
+ # your_parser_root.parse(str)
+ # end
+ #
+ def root(name)
+ define_method(:root) do
+ self.send(name)
+ end
+ end
+ end
+
+ def try(source, context) # :nodoc:
+ root.try(source, context)
+ end
+
+ def error_tree # :nodoc:
+ root.error_tree
+ end
+
+ def to_s_inner(prec) # :nodoc:
+ root.to_s(prec)
+ end
end
\ No newline at end of file