C# как лучше читать шаблонный текст?
Регекспом можно, наверное. А что значит красиво? Регексп подходит под это описание, но он медленнее, чем автомат, построенный вручную.
я думал, что можно как-то задать шаблон (не используя регекспы) так, что он сразу будет в предопределенную структуру данных все считывать
приведи пример чего хочешь?
Вид: 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 подкласса интовые, строка"
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;
}
}
Или все-таки счетчиком строк, индикатором состояния и switch-ем?Это вместе называется конечный автомат. Да, им тоже можно, и это тоже стандартный подход.
Кстати, существует автогенератор лексических анализаторов: http://ru.wikipedia.org/wiki/Lex (и далее по ссылкам про yacc но, возможно, написать один раз анализатор проще, чем изучить языки этих генераторов.
пасиб! что-то по типу этого постараюсь натворить.
лучше peg-ом парсить, с ним проще работать, чем с классическими парсерами
Оставить комментарий
AE169
Есть текст, который можно описать одним шаблоном (иногда в строке просто варьируется число параметров). Есть красивый способ считать это в C#? Или все-таки счетчиком строк, индикатором состояния и switch-ем?