C# как лучше читать шаблонный текст?

AE169

Есть текст, который можно описать одним шаблоном (иногда в строке просто варьируется число параметров). Есть красивый способ считать это в C#? Или все-таки счетчиком строк, индикатором состояния и switch-ем?

okis

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

AE169

я думал, что можно как-то задать шаблон (не используя регекспы) так, что он сразу будет в предопределенную структуру данных все считывать :)

Alexander08

приведи пример чего хочешь?

AE169

<Global>::_PEAR_call_destructors
Вид: IsDefinite IsFunction IsIdentityDefinite IsPublic IsThreadStatic
\PEAR.php, (770,10)-(770,31)
ReturnValue
<Global>::md5_file
Вид: IsFunction IsPublic IsThreadStatic
\Installer.php, (1635,14)-(1635,21)
ReturnValue
файл с такими записями автопарсить в экземпляры вида "строка, список, строка, 2 подкласса интовые, строка"

zorin29

Напиши тривиальный рекурсивный спуск:

public class MyReader
{
private string curToken;

public MyFileInfo ReadFileInfo
{
MyFileInfo result = new MyFileInfo;
if (curToken != "<Global>") throw Fail; // тебе решать - обрабатывать ошибки или нет
ReadToken;
ReadToken; // пропускаем два двоеточия (один token)
result.procedure = curToken;
ReadToken;
result.View = ReadList;
result.FileName = curToken;
ReadToken;
ReadToken; // запятую пропускаем
result.Coordinate1 = ReadCoordinatePair;
ReadToken; // дефис
result.Coordinate2 = ReadCoordinatePair;
ReadToken; // дефис
result.ReturnValue = curToken;
ReadToken; // настраиваемся на чтение следующего объекта
return result;
}
}

zorin29

Или все-таки счетчиком строк, индикатором состояния и switch-ем?
Это вместе называется конечный автомат. Да, им тоже можно, и это тоже стандартный подход.
Кстати, существует автогенератор лексических анализаторов: http://ru.wikipedia.org/wiki/Lex (и далее по ссылкам про yacc но, возможно, написать один раз анализатор проще, чем изучить языки этих генераторов.

AE169

пасиб! что-то по типу этого постараюсь натворить.

Dasar

лучше peg-ом парсить, с ним проще работать, чем с классическими парсерами
Оставить комментарий
Имя или ник:
Комментарий: