LINUX.ORG.RU

Ответ на: комментарий от special-k

Это стремно с точки зрения безопасности, не? И, к примеру, если там есть /, то эвал будет его парсить, как регэксп. Как можно этого избежать?

cdshines ★★★★★
() автор топика
Ответ на: комментарий от cdshines

на рубях я не очень силен, могу расписать алгоритм:

def parser(s) 
  var arr
  c = s.read()
  if c != '[' throw error
  while(!s.end())
    s.scipSpaces()
    c = s.read()
    if(c = '\'') then
      var i 
      while((c = s.read())  != '\'') 
        i += c
      arr.add(i)
    else if(c = '[')
      s.back() #тут грязный хак, возвращаем символ '[' обратно
      parser(s)
    else if(c = ']')
      break
  return arr
 

это не руби, и не какой либо язык программирования, это псевдокод, причем тут не хватате проверок, запятые между элементами массивов не проверяются, т.е. это просто принцип

Deleted
()
Ответ на: комментарий от cdshines

Это стремно с точки зрения безопасности, не? Нет, если это мой код.

Но суть не в этом, зачем делать еще один «стандарт», когда уже полно существующих с готовыми парсерами: yaml, json, xml...?

special-k ★★★★
()
Ответ на: комментарий от cdshines

в java есть для этого пара утилит типа stringtokenizer полагаю в ruby должно быть что-то похожее, попробуй поискать кучу работы по пропуску пробелов и тп оно може тза тебя сделать

Deleted
()
Ответ на: комментарий от Deleted

Ну пробелы можно заменить на запятые с пробелами элементарно - gsubом или чем-то таким.

Ч воспользовался парсилкой jsona, предварительно заменив символы на символы в экранированных кавычках.

cdshines ★★★★★
() автор топика
Ответ на: комментарий от special-k

элементарно , например нужен легко редактируемый человеком формат записи произвольных типов...

yaml - перегружен синтаксисом и снабжен корявыми парсерами

json - прост но нерасширяем, и даже дату там хранить придется в виде строки

а

xml - это писец

Deleted
()
Ответ на: комментарий от Deleted

это вообще не парсер

и вообще ничто.

здесь не нужна рекурсия.

def parse s
  res = []
  levels = [ res ]
  s.split(' ').each{|el|
    if el == '['
      new_arr = []
      levels.last << new_arr
      levels << new_arr
    elsif el == ']'
      levels.pop
    else
      levels.last << el
    end
  }
  res.first
end

а вообще я писал идеальные парсеры DSL-языков на java

сочувствую всем причастным.

special-k ★★★★
()
Ответ на: комментарий от special-k

здесь не нужна рекурсия

к.о.? грамматика от того что ты из-за шизофренического желания оптимизировать спички не перестает быть рекурсивной

сочувствую всем причастным.

себе посочувствуй лучше, после использования split все твое спичичнество на рекурсии выглядит идиотизмом 8)

Deleted
()
Ответ на: комментарий от Deleted

Ты просто не умеешь его готовить.

умею, но писать <somelingelementname></somelingelementname> мне лень, а копировать код - нехорошо, да и редакторов нормальных для xml нет

Deleted
()
Ответ на: комментарий от Deleted

Так это не код, это данные. Если взять покороче элементы, то вполне сносно. Хотя в данном случае, конечно, это избыточно, но ты сам сказал про расширяемость.

Deleted
()
Ответ на: комментарий от Deleted

ну дык, данные влияющие на логику программы и есть что бы вы думали, не говоря уже о такой штуке как ant - там на xml прямо код и пишется.

а помимо расширяемости есть еще избыточность, когда одну вещь можно разными способами сделать это уже порождает неоднозначность, что нехорошо. В xml для устранения сего есть валиадция, однако ее убогость отдельный вопрос.

Deleted
()
Ответ на: комментарий от cdshines

И, к примеру, если там есть /, то эвал будет его парсить, как регэксп. Как можно этого избежать?

Предварительно заменить все / на //?

anonymous
()
Ответ на: комментарий от anonymous

Это будет эвалиться в пкстой регэксп. Правильная замена - '/' ->'\«/\»', емнип. Я вроде так сделал.

cdshines ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.