def _parse_logic_str(logic_str)
return unless logic_str
stmt_list = []
logic_str.each_line do |line|
if line =~ /^\s*_(stag|cont|etag|elem)(?:\(\))?;?\s*(?:\#.*)?$/
kind = $1
stmt_list << ExpandStatement.new(kind.intern)
elsif line =~ /^\s*(_(element|content)([-()'"\w\s]*));?\s*(?:\#.*)?$/
str, kind, arg = $1, $2, $3
arg.strip!
if arg =~ /\A\((.*)\)\z/ then arg = $1 end
if arg.empty?
raise parse_error("'#{str}': element name required.", nil)
end
case arg
when /\A"(.*)"\z/ ; name = $1
when /\A'(.*)'\z/ ; name = $1
when /\A([-\w]+)\z/ ; name = $1
else
raise parse_error("'#{str}': invalid pattern.", nil)
end
unless name =~ /\A[-\w]+\z/
raise parse_error("'#{name}': invalid #{kind} name.", nil)
end
stmt_list << ExpandStatement.new(kind.intern, name)
elsif line =~ /^\s*print(?:\s+(.*?)|\((.*)\))\s*;?\s*$/
arg = $1 || $2
stmt_list << PrintStatement.new([NativeExpression.new(arg)])
else
stmt_list << NativeStatement.new(line.chomp, nil)
end
end
return stmt_list
end