module Sfp # main class which processes configuration description in SFP language either # in file or as a string class Parser # enable this class to process SFP into FDR (SAS+) include Sfp::SasTranslator attr_accessor :root_dir, :home_dir, :conformant attr_reader :root def initialize(params={}) @root_dir = (params[:root_dir].is_a?(String) ? params[:root_dir].strip : nil) @home_dir = (params[:home_dir].is_a?(String) ? params[:home_dir].strip : nil) @root = params[:root] @conformant = !!params[:conformant] end # @param string : a string in SFP language def parse(string) lexer = SfpLang::Lexer.new(string) tokens = ANTLR3::CommonTokenStream.new(lexer) parser = SfpLang::Parser.new(tokens) parser.root_dir = @root_dir parser.home_dir = @home_dir parser.sfp @root = parser.root @conformant = parser.conformant @parser_arrays = parser.arrays end def to_json(params={}) return 'null' if @root.nil? return Sfp::Helper.to_pretty_json(@root) if params[:pretty] return Sfp::Helper.to_json(@root) end def self.parse_file(filepath) homedir = File.expand_path(File.dirname(filepath)) parser = Sfp::Parser.new({:home_dir => homedir}) parser.parse(File.read(filepath)) parser.root end =begin # Parse SFP file and return its JSON representation def self.parse_file(file) return file_to_sfp(file) end def self.file_to_sfp(file) parser = Parser.new parser.parse_file(file) return parser.to_sfp end def self.to_sfp(string) parser = Parser.new parser.parse(string) return parser.to_sfp end # parse SFP file def parse_file(file) f = File.open(file, 'rb') lexer = SFP::Lexer.new(f) tokens = ANTLR3::CommonTokenStream.new(lexer) parser = SFP::Parser.new(tokens) parser.root_dir = (@root_dir == nil or @root_dir == '' ? File.expand_path('.') : @root_dir) parser.home_dir = File.dirname(f.path) parser.sfp @conformant = parser.conformant @root = parser.root @parser_arrays = parser.arrays end # parse SFP in a string def parse(text) lexer = SFP::Lexer.new(text) tokens = ANTLR3::CommonTokenStream.new(lexer) parser = SFP::Parser.new(tokens) parser.root_dir = (@root_dir == nil or @root_dir == '' ? File.expand_path(File.dirname('.')) : @root_dir) parser.home_dir = parser.root_dir parser.sfp @root = parser.root @parser_arrays = parser.arrays end # dump the parsed specification into standard output def dump(root=nil) return if root == nil root = Nuri::Sfp.deep_clone(@root) root.accept(ParentEliminator.new) puts JSON.pretty_generate(root) end def self.dump(root) return if root == nil root = Nuri::Sfp.deep_clone(root) root.accept(ParentEliminator.new) puts JSON.pretty_generate(root) end def to_sfp @root end def to_json root = self.to_sfp return if root == nil root = Nuri::Sfp.deep_clone(root) return Nuri::Sfp.to_json(root) end =end end =begin def self.to_json(sfp) root = Sfp::Helper.deep_clone(sfp) root.accept(Nuri::Sfp::ParentEliminator.new) return JSON.generate(root) end def self.to_pretty_json(sfp) root = Nuri::Sfp.deep_clone(sfp) root.accept(Nuri::Sfp::ParentEliminator.new) return JSON.pretty_generate(root) end =end end