Запутался с матчингом строки
От: Аноним  
Дата: 19.02.12 05:02
Оценка: :)
Здравствуйте, господа.

Никак не могу разобраться с матчингом строки.
Видел как лихо Влад на видеоконференции обращался с матчингом, решил попробовать.
Есть исходная строка, мне нужно перевести ее в другой формат.
Я пытаюсь разобрать ее по элементам:
foreach(line in sourceCode.Lines)
{
   // DEFINE_GUID(IID_IDirect3D9, 0x81bdcbca, 0x64d4, 0x426d, 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c);
   | "DEFINE_GUID($name, $v1," +
                     "$v2, $v3, $v4, $v5, $v6, " +
                     "$v7, $v8, $v9, $v10, $v11);" => 

        //   GUID IID_IDirect3D9 = {0x81bdcbca, 0x64d4, 0x426d, [0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c]};
        def result = name;

Но элементы становятся недоступны.
def result = name;

— компилятор ругается.

Что же я делаю не так?
Re: Запутался с матчингом строки
От: CodingUnit Россия  
Дата: 19.02.12 05:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, господа.


А>Никак не могу разобраться с матчингом строки.

А>Видел как лихо Влад на видеоконференции обращался с матчингом, решил попробовать.
А>Есть исходная строка, мне нужно перевести ее в другой формат.
А>Я пытаюсь разобрать ее по элементам:
А>Но элементы становятся недоступны.

А>Что же я делаю не так?


Интересно где это Влад делал матчинг строки с присвоением переменных? Это интересная фича но разбирать таким образом строки нельзя, можно матчить константу и компилятор найдет сопоставление, но разбирать содержимое строк и находить подстроки не может, возможно часть этого можно если использовать макрос regexp match (str), для разбора регулярных выражений. Можно создавать строки через сплайсы: $"Test string: $str1 $integer", но разбирать обратно нельзя.
Re[2]: Запутался с матчингом строки
От: Аноним  
Дата: 19.02.12 05:16
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Интересно где это Влад делал матчинг строки с присвоением переменных? Это интересная фича но разбирать таким образом строки нельзя, можно матчить константу и компилятор найдет сопоставление, но разбирать содержимое строк и находить подстроки не может, возможно часть этого можно если использовать макрос regexp match (str), для разбора регулярных выражений. Можно создавать строки через сплайсы: $"Test string: $str1 $integer", но разбирать обратно нельзя.


Ясно, спасибо.

PS. Я не говорил про матчинг строк Владом, он показывал чудеса матчинга в целом.
Re: Запутался с матчингом строки
От: Аноним  
Дата: 19.02.12 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что же я делаю не так?


А каким образом должна разбираться тут строка ?
Возможны разные варианты.

Можете воспользоваться макросом regexp match, который сопоставляет по регулярному выражению:

using Nemerle.Text;
using Nemerle.IO;

regexp match (str)
{
  | "a+.*" => printf ("a\n");
  | @"(?<num : int>\d+)-\w+" => printf ("%d\n", num + 3);
  | "(?<name>(Ala|Kasia))? ma kota" =>
     match (name)
     {
       | Some (n) => printf ("%s\n", n)
       | None => printf ("noname?\n")
     }
  | _ => printf ("default\n");
}


Можно даже так: https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/bug-1215.n
Re[2]: Запутался с матчингом строки
От: VoidEx  
Дата: 19.02.12 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно даже так: https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/bug-1215.n


Если конструктор бросает исключение, что будет? Отмена матчинга или исключение с match'е? Может ли конструктор провести дополнительную проверку и отменить матч?
Re: Запутался с матчингом строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.02.12 13:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что же я делаю не так?


ПМ он для структурированных объектов. Строки объект не структурированный. Их разбор — это парсинг. Для парсинга надо использовать парсер, или регексы. Примеры и того и другого лекого найти в исходниках на сайте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Запутался с матчингом строки
От: Ziaw Россия  
Дата: 19.02.12 15:51
Оценка: 4 (1)
Здравствуйте, VoidEx, Вы писали:

А>>Можно даже так: https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/bug-1215.n


VE>Если конструктор бросает исключение, что будет? Отмена матчинга или исключение с match'е? Может ли конструктор провести дополнительную проверку и отменить матч?


Будет исключение. Правда там не конструктор вызывается, а метод Parse. Никакой специальной обработки исключений возникающих в методе Parse нет. Хотя, не мешало бы эту фичу доработать. Если метод Parse возвращает option, то матч проходит только в случае возврата Some.
Re[4]: Запутался с матчингом строки
От: _NN_ www.nemerleweb.com
Дата: 20.02.12 08:58
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, VoidEx, Вы писали:


А>>>Можно даже так: https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/bug-1215.n


VE>>Если конструктор бросает исключение, что будет? Отмена матчинга или исключение с match'е? Может ли конструктор провести дополнительную проверку и отменить матч?


Z>Будет исключение. Правда там не конструктор вызывается, а метод Parse. Никакой специальной обработки исключений возникающих в методе Parse нет. Хотя, не мешало бы эту фичу доработать. Если метод Parse возвращает option, то матч проходит только в случае возврата Some.


Может просто вызывать стандартный метод bool TryParse(out T).
А если такого метода нет , то вызывать Parse и ловить исключение.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Запутался с матчингом строки
От: Ziaw Россия  
Дата: 20.02.12 13:24
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Может просто вызывать стандартный метод bool TryParse(out T).

_NN>А если такого метода нет , то вызывать Parse и ловить исключение.

Строить логику матча на исключениях неправильно. Перфоманс будет никакой. Предлагаю фичу:

stringmatch (str)
{
  | regexp @"DEFINE\($(?<x>.+),$(?<y>.+)\)" // матчим регексп
  | $"DEFINE($x,$y)" => // преобразуем в регексп выше и матчим
  | x is int => // int.TryParse
  | x is MyType => // Ищем методы:
    // MyType.TryParse(out string) 
    // MyType.Parse(string):option[MyType] 
    // MyType.Parse(string):MyType - ловим исключение

  // этот же алгоритм используем в регэкспах при указании типа переменных
  | regexp @"DEFINE\($(?<x : int>.+),$(?<y : int>.+)\)") 
  | $"DEFINE($(x : int),$(y : int))"
}


Считаю, что при обработке текстов будет очень удобно. regexp match можно будет пометить как депрекейтед через версию, так как она будет подмножеством этого оператора, а парсинг уже выходит за рамки регэкспов.

Простенькие КА парсеры будет писать одно удовольствие. Гораздо проще чем создавать пег парсер.

Единственное, чего бы хотелось, но я не знаю как сделать — поиск всех вхождений по длинной строке. Есть варианты?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.