1. C# / Говнокод #15844

    +130

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.IO;
    
    namespace SimpleLex
    {
        class Lexical
        {
            //Сюда передается путь к файлу конфигурации
            public string Path = "";
            //Определяем ключевые слова 
            string regular = "Color|Size|Name";
            public void lexical()
            {
                //Создаем массив строк для дальнейшего заполнения
                string[] conf = new string[1024];
                //Переменная счетчик
                int i = 0;
                //Заполняем массив из файла 
                //Path мы присваиваем значение при создании
                //объекта нашего класса.
                conf = File.ReadAllLines(Path);
                //Запускаем цикл чтения 
                while (conf.Length - 1 >= i)
                {
                // Создаем новый объект класса Regex
                // и передаем ему в качестве конструктора
                // cписок ключевых слов
                Regex RegularExp = new Regex(regular);
                //Начинаем поиск совпадений в текущей строке
                Match match = RegularExp.Match(conf[i]);
                while (match.Success)
                {
                    //Ожидаем наличия совпадений
                    break;
                    //Если нашли то выпрыгиваем 
                }
    
                switch (match.Value) // Смотрим что же мы обнаружили и вызываем соответствующий метод
                {
                    case "Color":
                        //вызываем метод Color_
                        //и передаем ему текущую строку для разбора
                        //Предварительно удалив все пробелы с двух сторон
                        //если они были метод Trim()
                        Color_(conf[i].Trim());
                        i++;
                        break;
                    case "Size":
                        size_(conf[i].Trim());
                        i++;
                        break;
                    default:
                        //все другое пропускаем
                        i++;
                        break;
                }
                }
            }
            void Color_(string str)
            {
                int i = 0;
                while (str.Substring(i,1)!= "=")
                {
                    //Ищем разделитель в данном случае "="
                    i++;
                }
                //Находим и извлекаем нужную нам информацию
                string value_ = str.Substring(i + 1, str.Length - (i+1)).Trim();
                //Теперь все зависит от вашей фантазии хотите 
                //Создайте класс который будет устанавливать цвет шрифта
                //И.т.д
    
                Console.WriteLine(value_);
                Console.ReadKey();
            }
            void size_(string str)
            {
                /*
                 * В этом методе я хочу показать как быть если вы используете
                 * в своем файле для каждой команды разные разделители
                 * в теории конечно можно все это засунуть в один метод
                 * Но я советую в дальнейшем если вы будите применять
                 * именно такую структуру передавать в метод тип разделителя
                 * и соответственно искать именно его другое дело если вы имеете
                 * различный формат входных данных как у нас параметр size имеет
                 * вид shize X=100,Y=500
                 */
                //Есть прекрасный метод 
                int i = 0;
                while (str.Substring(i,1) != " ")
                {
                    i++;
                }
                str = str.Substring(i, str.Length - i).Trim();
                string[] commandMas = new string[3];
                commandMas = str.Split(',');

    (GetPrivateProfileString? Не, не слышал)
    Лютый песдеzz с сайта vbbook.ru

    Запостил: brutushafens, 24 Апреля 2014

    Комментарии (61) RSS

    • cleaned
      Ответить
    • > GetPrivateProfileString
      А в шарпе разве нет ничего, кхм, более высокоуровневого?
      Ответить
      • Я так понимаю мы видим именно "более высокоуровневое".
        Ответить
      • Вроде как нету. Там рекомендуется использовать другие вещи вместо ини файлов.
        Ответить
        • > другие вещи
          XML поди?
          Ответить
          • Да
            Ответить
          • http://www.codeproject.com/Articles/14744/Read-Write-App-Config-File-with-NET
            тут об этом рассказано :)
            Ответить
            • <configuration>
               <appSettings>
                  <add key="Setting1" value="Very" />
                  <add key="Setting2" value="Easy" />
               </appSettings>
              </configuration>
              Фублять. Это только гуйней править...

              Вот в qt и boost, имхо, правильный подход. Единый интерфейс для конфигов в xml/ini/json. Кому что нравится - тот то и юзает. Код от этого не меняется.
              Ответить
              • Аска, не звезди.
                В Visual Studio есть xml schema для всех конфигов. Так что даже в xml-редакторе править такие конфиги вполне удобно: подсказки, автодополнение и пр.

                Да, гуйня тоже есть для многих конфигов. Тыц-тыц мышкой - готово!

                Но самое главное, - чаще всего вовсе не нужно заглядывать в эти конфиги и даже можно не подозревать об их существовании. Всё само генерируется в подалвющем большинстве случаев.

                ЗЫ: я тоже обеими руками за более компактные форматы типа json/ini и вообще бинарные.
                Ответить
                • CSS горздо мощнее в смысле описательной силы, чем JSON, во многих ситуациях он может сэкономить место, когда есть повторяющиеся элементы, а так же описать зависимости между элементами напрямую не связаными друг с другом. Декларации можно парсить по одной а не ждать конца загрузки документа, есть комментарии, есть язык запросов.
                  Есть один недостаток - есть сколько-то очень специфических возможностей, которые применимы только в контексте ДОМа. Но все равно, он гораздо лучше JSONа.
                  Ответить
                  • JSON - способ представления данных. Он совершенно ортогонален CSS.
                    Что мешает записать селектор (ключ) и набор его атрибутов (значения) в виде JSON?
                    Ответить
                    • Хотелось бы увидеть пример передачи информации об альбомах ELO и треках в них (с длительностью каждого трека) в CSS.
                      Ответить
                      • А можно пример в каком-нибудь другом формате? Я чесно не уверен, почему это должно быть сложно.
                        Ответить
                        • ну что-то вроде этого
                          { artist: "ELO",
                            genres: ["art rock", "progressive rock"],
                            albums: [
                              { name: "Time",
                                year: 1981,
                                tracks: [
                                  { name: "Prologue",
                                    index: 1,
                                    duration: "1:15",
                                  },
                                  { name: "Twilight",
                                    index: 2,
                                    duration: "3:35",
                                  },
                                  { name: "Yours Truly, 2095",
                                    index: 3,
                                    duration: "3:15",
                                  },
                                ]
                              }
                            ]
                          }
                          Ответить
                          • . artist { content: "ELO" }
                            . generes:nth-child(1) { content: "art rocks" }
                            . generes:nth-child(2) { content: "progressive rocks" }
                            . albums name { content: "Time" }
                            . albums year { content: 1981 }
                            /* just for the sake of diversity */
                            . albums tracks:nth-child(1) { name: "Prologue"; index: 1; duration: "1:15" }
                            /* ... */

                            Ну, что-нибудь такое, например.
                            Ответить
                            • 1. Мне кажется, или букв стало существенно больше?
                              2. Что делать, если имена полей содержат пробелы (e.g.
                              "approx sales")?
                              3. Насколько просто понять, что закончился один документ и начался другой? Ведь порядок правил в css не фиксирован, их можно размещать в произвольном порядке.
                              Ответить
                              • Ну это частный случай. Если в JSON будут повторяющиеся элементы, у CSS есть все шансы выиграть по обьему.
                                А как в Прологе узнают, что програма закончилась? В ПаверЛум есть, например, специальное правило, которое управляет парсером, и инструктирует его сделать все выводы предшевстующие данному правилу, но можно и без него обойтись.
                                На счет имен полей - ну если бы CSS использовался бы не только в контексте DOM, то наверное этот момент исправили. В JSON есть тоже свои неприятности, например километровые строки, в которых нельзя делать переносы.

                                Опять же CSS именно, как конкретная реализация обладает недостатками, но в принципе, если эту идею доработать (а еще лучше, начать дорабатывать с Пролога и Ко), то возможностей и удобства поприбавилось бы.
                                Ответить
                              • Да, ну и по поводу объема еще, где-то потеряли, где-то приобрели. Используя пример выше, мы приобрели возможность написать запрос типа albums > name который вернет нам имена всех альбомов, для чего в JSON у нас нет инструмента, его нужно было бы писать.
                                Ответить
                                • > написать запрос типа albums > name который вернет нам имена всех альбомов

                                  написать где? в тексте передаваемого документа? Или в базе данных элементов?

                                  Имея монгу, я тоже могу написать что-то вроде
                                  db.artists.find({'name': 'ELO'}, {'albums.name' : 1})
                                  Безусловно, это тривиально можно было бы выразить без js-методов, использую лишь json.
                                  Ответить
                                  • Написать где? - в самом CSS, это выражение - валидный CSS.

                                    > Имея монгу
                                    А у меня есть конга, велосипед такой. При чем здесь это, это как-то меняет возможности формата JSON? Эта информация отсутствует в самом формате, чтобы ее от туда получить, нужно писать дополнительный код. Если его кто-то уже написал, то это не отменяет, а скорее подтверждает наличие такой необходимости.
                                    Ответить
                                • Тут поддвачну, для json не хватает языка запросов вроде xpath
                                  Ответить
                                  • Тащем-та, языков запросов для жсона существует уже несколько, выбирай. Проблема в том, что ни один пока не стандартизирован.

                                    Языков схем для жсона тоже несколько уже сделано. Стандарта тоже пока нет.

                                    И ваще, раз уж мы в теме о Шарпике, то генерация набора классов делается в два клика мышкой. Десериализация из json - одна строка кода. А дальше - линком его, линком! Самый офигительный язык запросов.
                                    Ответить
                                    • >Тащем-та, языков запросов для жсона существует уже несколько, выбирай. Проблема в том, что ни один пока не стандартизирован.
                                      Какие? Не, ну я и на питоне могу сделать в одно списковое выражение, но вот есть у меня json viewer, там бы эта штука не помешала.
                                      Ответить
                          • Ticket To The Moon!
                            Ответить
                    • Массив байтов - способ представления данных. Что мешает записать селектор и его атрибуты в виде массива байтов?

                      Видимо wvxvw хочет юзать формат представления непосредственно, а не городить ксс-овер-жсон и графы-овер-хмл. И логика в этом есть ;)
                      Ответить
                      • И в чем больше "описательной силы" в массиве байтов, JSON или CSS?
                        >а не городить ксс-овер-жсон
                        Сравниваются ортогональные вещи.

                        Да и как вообще посчитать "описательную силу". Поделить описательную работу на обписанное расстояние?
                        Ответить
                        • > Да и как вообще посчитать "описательную силу"
                          Посмотреть, что данные конкретной задачи удобно ложатся на используемый формат. Где меньше ёбли - тот и имеет большую "описательную силу" для данной задачи.

                          А в общем смысле - серебряной пули всяко нет.

                          P.S. > Поделить описательную работу на обписанное расстояние?
                          Работу по описанию данных в нужном формате на расстояние до ближайшей либы ;)
                          Ответить
                          • > данные конкретной задачи удобно ложатся на используемый формат
                            > А в общем смысле - серебряной пули нет.


                            Нет-нет-нет, @wvxvw совсем недавно утвержал существование универсального формата непреодолимой выразительности, способного наилучшим образом представлять произвольные данные во всех случаях. Он просто ни с кем не делится своим открытием. Грусть.
                            Ответить
                        • Сравнивая описательную силу можно получить и частично упорядоченое множество, поэтому задавать вопрос "где больше выразительной силы" в общем случае не корректно. Может быть так, что язык А может выразить Б, но не может В, а язык Г может выразить В, но не может Б.

                          Например, JSON не может выразить is-a отношение. Т.е. описав два объекта, например: { а: 1 } и { а: 1, б: 2 } мы не знаем, является ли второй объект разновидностью первого, или это просто совпадение. CSS может это сделать, если одно и то же правило будет применятся к обоим объектам.
                          Ответить
                    • то же, что мешает записать код С++ в JSON - ничего, но это ничего и не изменит, т.как с точки зрения JSON ето по-прежнему будет просто строка, а не код на С++.
                      В CSS не хватает возможности записывать селекторы на правой стороне выражения, но все механизмы к этому уже есть, просто нужно разрешить это делать. И тогда можно будет структуру представляеть более наглядно, хотя это и не обязательно. Например, из правила:

                      a b { whatever }

                      мы можем вывести факт существования элемента a, и его вложеного элемента b. Просто типичные CSS не описывают структуру, потому что за них это уже кто-то сделал, но это не говорит о том, что это в принципе не возможно.
                      Точно таким же образом структуру описывает Пролог, или КИФ / ПаверЛум и т.п.
                      Ответить
              • на вкус и цвет фломастеры разные. никто не мешает использовать сериализацию для конфигов.
                Ответить
    • Вот почему INI до сих пор популярнее православного JSON/XML/подставить нужное?

      У быдлокодеров
      Ответить
      • Ini популярнее? Не сказал бы, не сказал.
        Ответить
      • Смотря для чего... Если конфиг пишет прога - хмл или жсон однозначно лучше.

        Но вот вручную править хмл и жсон довольно противно. Да и в жсоне комментов нет. И если не нужна иерархия больше одного-двух уровней - иниподобные форматы рулят.
        Ответить
        • Еще xml никак нельзя заставить писать ключи в определенном порядке.
          Ответить
          • Ты об атрибутах? Все остальное же можно вываливать в нужном порядке.
            Ответить
            • Да. Если у тебя есть значение атрибута на километр и ты хочешь вывалить его в конец, или просто порядок соблюсти - хуй тебе.

              Вернись на форум.
              Ответить
            • а что не так с атрибутами?
              что мешает их в нужном порядке вываливать?
              Ответить
              • Видимо, либа, которую юзает @s-a--m, так не умеет. Грусть.
                Ответить
                • мне почему-то на секундочку показалось, что ты невзаправду загрустил.
                  но сразу после этого мне и самому стало грустно, я даже всплакнул и налил себе водки.
                  Ответить
                • Ну если это дом - то вообще говоря и не обязана.
                  Ответить
                • Ну найди мне либу, скажем, для питона, которая это умеет. lxml не умеет.
                  Ответить
                  • http://lmgtfy.com/?q=lxml+sort+attributes
                    
                    http://stackoverflow.com/questions/14917943/python-lxml-enforcing-an-specific-order-for-attributes
                    Ответить
                    • template = ('<FileFormat ID="%d" Name="%s" PUID="%s" Version="%s" '
                                  'MIMEType="%s">')
                      
                      xml = template % (id, name, puid, version, mimetype)

                      Спасиб, но я так тоже умею, хуячить xml через printf. Нафига вообще нужен формат сериализации, библиотеками для которого проще не пользоваться?
                      Ответить
                      • Что за пиздец с этим lxml... Почему имя аттрибута не может быть '1'?
                        Ответить
                      • ты дальше первого ответа читал, нет?

                        It looks like lxml serializes attributes in the order you set them

                        As of lxml 3.3.3 (perhaps also in earlier versions) you can pass an OrderedDict of attributes to the lxml.etree.(Sub)Element constructor and the order will be preserved when using lxml.etree.tostring(root)
                        Ответить
                        • Читал, попутно разгребая баги, см. соседний комент.
                          Сейчас поковырял свои сырцы конца 2012

                          # не помогает    
                          #    root.append(Element('tag', OrderedDict([
                          #        ('name1', 'value1'), 
                          #        ('name2', 'value2'), 
                          #        ('name3', 'value3'), 
                          #    ])))
                          #    print ElementTree.tostring(root)
                          Ответить
                          • Ах да, это я делал через встроенный xml.etree. Мож для него найдешь, искперт? :)
                            Ответить
                            • > это я делал через встроенный xml.etree
                              приехали
                              Втроенный не умеет, там только словарики принимаются, понятно, почему OrderedDict не работает. Юзай потоковый интерфейс, там уж наверняка порядок соблюдается. В жабе громоздко, но зато всё работает из коробки.
                              http://ideone.com/cfYGwy
                              Ответить
                              • > В жабе громоздко, но зато всё работает из коробки.
                                Не работает же: http://ideone.com/6l6C6i
                                Ответить
    • Порадовали комментарии

      //Запускаем цикл чтения 
      while (conf.Length - 1 >= i)
      Ответить
    • Да-а-а... Тут даже просто перечислить сорта говна долго будет.

      string[] conf = new string[1024];
      
      conf = File.ReadAllLines(Path);

      Это чтобы ГЦ не простаивал?
      Regex с одним и тем же паттерном создаётся на каждой итерации цикла заново. То же греем ГЦ.

      while (match.Success)
      {
          //Ожидаем наличия совпадений
          break;
          //Если нашли то выпрыгиваем 
      }

      Сакральный смысл наличия этого цикла мною так и не понят.

      О методе String.IndexOf аффтырь не слышал.
      Ответить
    • Стертор! Ты что? На сишарп перейти решил, окаянный?
      Ответить
      • > http://vbbook.ru/visual-c.net/chtenie-konfigyracionnux-faiylov-c/

        Это не сишарп, это вижуал си дот нет. Большая разница!
        Ответить
    • cleaned
      Ответить

    Добавить комментарий