Я в настоящее время работаю над проектом, который получает доступ к части аппаратных средств с помощью тонн твердых кодированных ячеек памяти. Эти местоположения могут измениться основанный на прихоти инженера-электрика, таким образом, я надеюсь генерировать код из карты распределения памяти инженера. Скажем, карта является простым текстовым файлом как:
Name, Type, Address, Description
Foo, int, A001, Foo integer variable
Bar, float, A002, Bar float variable
Я хотел бы автоматически сгенерировать код (не IL) подобный:
class MachineMap
{
/// <summary>
/// Foo integer variable
/// </summary>
public readonly Addressable<int> Foo = new Addressable<int>("A001");
/// <summary>
/// Bar float variable
/// </summary>
public readonly Addressable<float> Bar = new Addressable<float>("A002");
}
У кого-либо есть идеи об инструментах, которые сделали бы эту задачу легкой, или легче?
Посмотрите на встроенную возможность генерации кода в Visual Studio называется T4. Или другим вариантом может быть коммерческий продукт, например CodeSmith .
Прочтите статью Скотта Хансельмана:
Генерация кода T4 (Text Template Transformation Toolkit) - лучший секрет Visual Studio
Подобно предложению Ника Осло, StringTemplate - это еще один способ создания исходного кода на основе шаблона из четко определенной грамматики. У него есть порт C #, поэтому его достаточно легко использовать из .NET.
Вы можете создать DSL по вашему выбору, а затем использовать M Grammar (часть Осло) для его анализа.
Используйте регулярное выражение вроде этого (используя gvim
или vim
):
:%s/\(.*\), \(.*\), \(.*\), \(.*\)/public readonly Addressable<\2> \1 = new Addressable<\2>("\3")/g
Это решает основную часть парсинга. Затем вы конкатенируете содержимое с файлами заголовков и колонтитулов:
type header.txt converted.txt footer.txt > source.c
Если карта более сложная, используйте инструмент для грамматического разбора. В противном случае, если она действительно настолько проста, избегайте использования танка для такого маленького гвоздя.