module Pione module Parser # DocumentParser is a parser for PIONE rule document. class DocumentParser < Parslet::Parser include CommonParser include LiteralParser include FeatureExprParser include ExprParser include FlowElementParser include BlockParser include RuleDefinitionParser # # root # root(:toplevel_elements) # @!method toplevel_elements # # Return +toplevel_elements+ parser. This is root parser for reading a # document. # # @return [Parslet::Atoms::Entity] # +toplevel_elements+ parser rule(:toplevel_elements) { (empty_lines? >> space? >> toplevel_element >> empty_lines?).repeat } # @!method toplevel_element # # Return +toplevel_element+ parser. # # @return [Parslet::Atoms::Entity] # +toplevel_element+ parser # # @example # # document toplevel assignment # DocumentParser.toplevel_element.parse("$X := 1") # @example # # define rule # DocumentParser.new.toplevel_element.parse <> assignment >> line_end } # @!method param_block # # Return +param_block+ parser. # # @return [Parslet::Atoms::Entity] # +param block+ parser # # @example # DocumentParser.new.param_block <> ((keyword_Basic | keyword_Advanced).as(:param_type) >> space).maybe >> keyword_Param >> line_end >> (assignment_line | pad).repeat.as(:in_block_assignments) >> (keyword_End | syntax_error("it should be block end", :keyword_End)) >> line_end ).as(:param_block) } # package_line rule(:package_line) { ( space? >> keyword_package >> space >> package_name >> line_end ).as(:package) } # require_line rule(:require_line) { ( space? >> keyword_require >> space >> package_name >> line_end ).as(:require) } rule(:expr_line) { space? >> expr >> line_end } end end end