- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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(',');
brutushafens 24.04.2014 20:43 # −1
bormand 24.04.2014 21:00 # 0
А в шарпе разве нет ничего, кхм, более высокоуровневого?
Abbath 24.04.2014 21:08 # +2
Zuzik 24.04.2014 22:23 # +1
bormand 24.04.2014 22:26 # +1
XML поди?
Zuzik 24.04.2014 22:28 # +1
Lokich 25.04.2014 11:52 # +1
тут об этом рассказано :)
bormand 25.04.2014 12:18 # +1
Вот в qt и boost, имхо, правильный подход. Единый интерфейс для конфигов в xml/ini/json. Кому что нравится - тот то и юзает. Код от этого не меняется. Фублять. Это только гуйней править...
guest 25.04.2014 12:39 # +1
В Visual Studio есть xml schema для всех конфигов. Так что даже в xml-редакторе править такие конфиги вполне удобно: подсказки, автодополнение и пр.
Да, гуйня тоже есть для многих конфигов. Тыц-тыц мышкой - готово!
Но самое главное, - чаще всего вовсе не нужно заглядывать в эти конфиги и даже можно не подозревать об их существовании. Всё само генерируется в подалвющем большинстве случаев.
ЗЫ: я тоже обеими руками за более компактные форматы типа json/ini и вообще бинарные.
wvxvw 25.04.2014 14:11 # −1
Есть один недостаток - есть сколько-то очень специфических возможностей, которые применимы только в контексте ДОМа. Но все равно, он гораздо лучше JSONа.
3.14159265 25.04.2014 14:45 # +1
Что мешает записать селектор (ключ) и набор его атрибутов (значения) в виде JSON?
roman-kashitsyn 25.04.2014 14:50 # +1
wvxvw 25.04.2014 15:08 # +1
roman-kashitsyn 25.04.2014 15:38 # +1
wvxvw 25.04.2014 16:22 # +1
Ну, что-нибудь такое, например.
roman-kashitsyn 25.04.2014 16:27 # +1
2. Что делать, если имена полей содержат пробелы (e.g.
"approx sales")?
3. Насколько просто понять, что закончился один документ и начался другой? Ведь порядок правил в css не фиксирован, их можно размещать в произвольном порядке.
wvxvw 25.04.2014 16:38 # +1
А как в Прологе узнают, что програма закончилась? В ПаверЛум есть, например, специальное правило, которое управляет парсером, и инструктирует его сделать все выводы предшевстующие данному правилу, но можно и без него обойтись.
На счет имен полей - ну если бы CSS использовался бы не только в контексте DOM, то наверное этот момент исправили. В JSON есть тоже свои неприятности, например километровые строки, в которых нельзя делать переносы.
Опять же CSS именно, как конкретная реализация обладает недостатками, но в принципе, если эту идею доработать (а еще лучше, начать дорабатывать с Пролога и Ко), то возможностей и удобства поприбавилось бы.
wvxvw 25.04.2014 16:44 # +1
roman-kashitsyn 25.04.2014 16:56 # +1
написать где? в тексте передаваемого документа? Или в базе данных элементов?
Имея монгу, я тоже могу написать что-то вроде Безусловно, это тривиально можно было бы выразить без js-методов, использую лишь json.
wvxvw 25.04.2014 17:01 # +1
> Имея монгу
А у меня есть конга, велосипед такой. При чем здесь это, это как-то меняет возможности формата JSON? Эта информация отсутствует в самом формате, чтобы ее от туда получить, нужно писать дополнительный код. Если его кто-то уже написал, то это не отменяет, а скорее подтверждает наличие такой необходимости.
guest 25.04.2014 17:04 # +1
guest 25.04.2014 20:14 # 0
Языков схем для жсона тоже несколько уже сделано. Стандарта тоже пока нет.
И ваще, раз уж мы в теме о Шарпике, то генерация набора классов делается в два клика мышкой. Десериализация из json - одна строка кода. А дальше - линком его, линком! Самый офигительный язык запросов.
guest 25.04.2014 20:54 # 0
Какие? Не, ну я и на питоне могу сделать в одно списковое выражение, но вот есть у меня json viewer, там бы эта штука не помешала.
eth0 25.04.2014 18:41 # +1
bormand 25.04.2014 15:03 # +1
Видимо wvxvw хочет юзать формат представления непосредственно, а не городить ксс-овер-жсон и графы-овер-хмл. И логика в этом есть ;)
3.14159265 25.04.2014 16:06 # +5
>а не городить ксс-овер-жсон
Сравниваются ортогональные вещи.
Да и как вообще посчитать "описательную силу". Поделить описательную работу на обписанное расстояние?
bormand 25.04.2014 16:10 # +3
Посмотреть, что данные конкретной задачи удобно ложатся на используемый формат. Где меньше ёбли - тот и имеет большую "описательную силу" для данной задачи.
А в общем смысле - серебряной пули всяко нет.
P.S. > Поделить описательную работу на обписанное расстояние?
Работу по описанию данных в нужном формате на расстояние до ближайшей либы ;)
roman-kashitsyn 25.04.2014 16:15 # +4
> А в общем смысле - серебряной пули нет.
Нет-нет-нет, @wvxvw совсем недавно утвержал существование универсального формата непреодолимой выразительности, способного наилучшим образом представлять произвольные данные во всех случаях. Он просто ни с кем не делится своим открытием. Грусть.
wvxvw 25.04.2014 16:47 # +3
wvxvw 25.04.2014 16:30 # +1
Например, JSON не может выразить is-a отношение. Т.е. описав два объекта, например: { а: 1 } и { а: 1, б: 2 } мы не знаем, является ли второй объект разновидностью первого, или это просто совпадение. CSS может это сделать, если одно и то же правило будет применятся к обоим объектам.
wvxvw 25.04.2014 15:05 # +1
В CSS не хватает возможности записывать селекторы на правой стороне выражения, но все механизмы к этому уже есть, просто нужно разрешить это делать. И тогда можно будет структуру представляеть более наглядно, хотя это и не обязательно. Например, из правила:
a b { whatever }
мы можем вывести факт существования элемента a, и его вложеного элемента b. Просто типичные CSS не описывают структуру, потому что за них это уже кто-то сделал, но это не говорит о том, что это в принципе не возможно.
Точно таким же образом структуру описывает Пролог, или КИФ / ПаверЛум и т.п.
Lokich 25.04.2014 14:22 # +1
Fai 24.04.2014 22:39 # +2
У быдлокодеров
Zuzik 24.04.2014 23:22 # +1
bormand 24.04.2014 23:23 # +4
Но вот вручную править хмл и жсон довольно противно. Да и в жсоне комментов нет. И если не нужна иерархия больше одного-двух уровней - иниподобные форматы рулят.
guest 25.04.2014 13:18 # +1
bormand 25.04.2014 13:21 # +1
guest 25.04.2014 13:28 # +1
Вернись на форум.
defecate-plusplus 25.04.2014 14:31 # +1
что мешает их в нужном порядке вываливать?
roman-kashitsyn 25.04.2014 14:35 # +1
defecate-plusplus 25.04.2014 14:52 # +6
но сразу после этого мне и самому стало грустно, я даже всплакнул и налил себе водки.
roman-kashitsyn 25.04.2014 14:57 # +5
Ага. Я тоже. Потом расстегнул ватник, выпустил медведя погулять, почистил калашников и сел играть на балалайке.
guest 25.04.2014 17:05 # +2
roman-kashitsyn 25.04.2014 23:20 # +2
guest 26.04.2014 00:39 # −1
bormand 25.04.2014 14:58 # +1
guest 25.04.2014 17:05 # +1
roman-kashitsyn 25.04.2014 17:52 # +1
guest 25.04.2014 18:30 # +2
Спасиб, но я так тоже умею, хуячить xml через printf. Нафига вообще нужен формат сериализации, библиотеками для которого проще не пользоваться?
guest 25.04.2014 19:26 # +1
roman-kashitsyn 25.04.2014 20:14 # 0
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)
guest 25.04.2014 21:00 # 0
Сейчас поковырял свои сырцы конца 2012
guest 25.04.2014 21:08 # 0
roman-kashitsyn 25.04.2014 22:14 # +1
приехали
Втроенный не умеет, там только словарики принимаются, понятно, почему OrderedDict не работает. Юзай потоковый интерфейс, там уж наверняка порядок соблюдается. В жабе громоздко, но зато всё работает из коробки.
bormand 25.04.2014 22:26 # 0
Не работает же: http://ideone.com/6l6C6i
roman-kashitsyn 25.04.2014 23:16 # 0
AppleMan 25.04.2014 12:40 # +1
guest 25.04.2014 12:49 # +2
Это чтобы ГЦ не простаивал?
Regex с одним и тем же паттерном создаётся на каждой итерации цикла заново. То же греем ГЦ.
Сакральный смысл наличия этого цикла мною так и не понят.
О методе String.IndexOf аффтырь не слышал.
guest 25.04.2014 13:19 # +2
DBdev 25.04.2014 19:37 # +2
Это не сишарп, это вижуал си дот нет. Большая разница!
brutushafens 25.04.2014 19:42 # −1