Regex match и свои типы
От: _nn_ www.nemerleweb.com
Дата: 26.04.10 13:58
Оценка:
Можно ли добавить в regex match парсить свои типы?

  [Record]
  class MyType
  {
    [Accessor]
    _s : string;
  }

  public Main() : void
  {
    regexp match("abc")
    {
      | @"(?<m : MyType>\w+)" => WriteLine(m.S);
      | _ => WriteLine("No match");
    }
  }


Это позволит парсить практически все что нужно одним махом.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Regex match и свои типы
От: _nn_ www.nemerleweb.com
Дата: 26.04.10 14:39
Оценка:
Здравствуйте, _nn_, Вы писали:

Вопрос закрыт.
Надо добавить в MyType
    public static Parse(s : string) : MyType
    {
      MyType(s)
    }


А если MyType трогать нельзя, то можно через дополнительный класс сделать:
  public class MyTypeParser
  {
    public static Parse(s : string) : MyType
    {
      MyType(s)
    }
  }

    regexp match("abc")
    {
      | @"(?<m : MyTypeParser>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString()); // A.MyType
      | _ => WriteLine("No match");
    }


P.S.
По ходу еще баг нашелся. Это все не работает с генериками

using Nemerle.Text;
using System.Console;
using Nemerle.Utility;

module A
{
  [Record]
  public class MyType[T]
  {
    [Accessor]
    _s : string;
    
    public static Parse(s : string) : MyType[T]
    {
      MyType(s)
    }
  }

  public Main() : void
  {
    regexp match("abc")
    {
      | @"(?<m : MyType[string]>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString());
      | _ => WriteLine("No match");
    }
  }
}


Это компилируется, но падает при запуске.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Regex match и свои типы
От: hardcase Пират http://nemerle.org
Дата: 26.04.10 19:04
Оценка: 1 (1)
Здравствуйте, _nn_, Вы писали:


__>Это компилируется, но падает при запуске.


Без указания типа — работает:
using System;
using System.Console;
using SCG = System.Collections.Generic;

using Nemerle.Assertions;
using Nemerle.Text;
using Nemerle.Utility;

namespace test222 {

    [Record]
    class MyType[T] {
    
        [Accessor] data : T;
    
        public static Parse(s : T) : MyType[T] {
            MyType(s)
        }
    
        public override ToString() : string {
            $<#<<< $data >>>#>
        }
    
    }


    module Program {

        Main() : void {
            regexp match(ReadLine()) {
                | @"(?<m : MyType>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString());
                | _ => WriteLine("No match");
            }
            WriteLine("Press any key to continue...");
            _ = ReadKey(true);
        }

    }

}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Regex match и свои типы
От: _nn_ www.nemerleweb.com
Дата: 27.04.10 09:36
Оценка:
Здравствуйте, hardcase, Вы писали:

Я вот пробовал исправить макрос, но что-то не получается.
Попробовал другое выражение, чтобы паттерн подошел:

Вместо
def namesreg = Regex (@"\(\?\<(\w+)\s*(:\s*((\w|\.)+))?");


def namesreg = Regex (@"\(\?\<(\w+)\s*(:\s*((\w|\.)+(\[(\w|\.)+\])?))?");


Но все равно падает.
Как я понял проблема в наименовании группы, но как-то не получается понять где оно формируется.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Regex match и свои типы
От: _nn_ www.nemerleweb.com
Дата: 27.04.10 11:13
Оценка:
Здравствуйте, hardcase, Вы писали:

Есть еще проблема с типами не из своей сборки.

using System;
using System.Console;
using System.Net;

using Nemerle.Text;


namespace X
{
  module Program
  {
    Main() : void
    {
      regexp match("1.2.3.4")
      {
        | @"(?<address : IPAddress>\w+)" => Console.WriteLine(address);
        | _ => Console.WriteLine("no match")
      }
    }
  }
}


Error: unbound name 'IPAddress'


А если свой тип подставить то работает

namespace X
{
  module IPAddressParser
  {
    public Parse(s : string) : IPAddress
    {
      IPAddress.Parse(s)
    }
  }

  module Program
  {
    Main() : void
    {
      regexp match("1.2.3.4")
      {
        | @"(?<address : IPAddressParser>\w+)" => Console.WriteLine(address);
        | _ => Console.WriteLine("no match")
      }
    }
  }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Regex match и свои типы
От: hardcase Пират http://nemerle.org
Дата: 27.04.10 13:09
Оценка: 7 (1)
Здравствуйте, _nn_, Вы писали:

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


__>Есть еще проблема с типами не из своей сборки.



Внешние имена пофиксил. А вот с генериками пока не решил что делать.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.