Я также не знаю, есть ли реализация C #, которая позволила бы вам сохранить управляемый код. Возможно, вам придется использовать неуправляемый импорт C / C ++.

я есть следующий файл и который нужно проанализировать

--TestFile
Start ASDF123
Name "John"
Address "#6,US" 
end ASDF123

Строки начинаются с-- будут рассматриваться как строки комментариев. и файл начинается с «Пуск» и заканчиваетсяend, Строка послеStart этоUserID а затемname а такжеaddress будет внутри двойных кавычек.

Мне нужно проанализировать файл и записать проанализированные данные в XML-файл.

Таким образом, полученный файл будет похож

<ASDF123>
  <Name Value="John" />
  <Address Value="#6,US" />
</ASDF123>

теперь я использую сопоставление с образцом (Regular Expressions) для разбора вышеуказанного файла. Вот мой пример кода.

    /// <summary>
    /// To Store the row data from the file
    /// </summary>
    List<String> MyList = new List<String>();

    String strName = "";
    String strAddress = "";
    String strInfo = "";

метод : ReadFile

    /// <summary>
    /// To read the file into a List
    /// </summary>
    private void ReadFile()
    {
        StreamReader Reader = new StreamReader(Application.StartupPath + "\\TestFile.txt");
        while (!Reader.EndOfStream)
        {
            MyList.Add(Reader.ReadLine());
        }
        Reader.Close();
    }

метод : FormateRowData

    /// <summary>
    /// To remove comments 
    /// </summary>
    private void FormateRowData()
    {
        MyList = MyList.Where(X => X != "").Where(X => X.StartsWith("--")==false ).ToList();
    }

метод : ParseData

    /// <summary>
    /// To Parse the data from the List
    /// </summary>
    private void ParseData()
    {
        Match l_mMatch;
        Regex RegData = new Regex("start[ \t\r\n]*(?<Data>[a-z0-9]*)", RegexOptions.IgnoreCase);
        Regex RegName = new Regex("name [ \t\r\n]*\"(?<Name>[a-z]*)\"", RegexOptions.IgnoreCase);
        Regex RegAddress = new Regex("address [ \t\r\n]*\"(?<Address>[a-z0-9 #,]*)\"", RegexOptions.IgnoreCase);
        for (int Index = 0; Index < MyList.Count; Index++)
        {
            l_mMatch = RegData.Match(MyList[Index]);
            if (l_mMatch.Success)
                strInfo = l_mMatch.Groups["Data"].Value;
            l_mMatch = RegName.Match(MyList[Index]);
            if (l_mMatch.Success)
                strName = l_mMatch.Groups["Name"].Value;
            l_mMatch = RegAddress.Match(MyList[Index]);
            if (l_mMatch.Success)
                strAddress = l_mMatch.Groups["Address"].Value;
        }
    }

метод : WriteFile

    /// <summary>
    /// To write parsed information into file.
    /// </summary>
    private void WriteFile()
    {
        XDocument XD = new XDocument(
                           new XElement(strInfo,
                                         new XElement("Name",
                                             new XAttribute("Value", strName)),
                                         new XElement("Address",
                                             new XAttribute("Value", strAddress))));
        XD.Save(Application.StartupPath + "\\File.xml");
    }

я слышал оParserGenerator

Пожалуйста, помогите мне написать парсер с использованием lex и yacc. Причина этого в том, что мой существующий парсер (Pattern Matchingне является гибким, более того, это не правильный путь (я так думаю).

Как я могу использоватьParserGenerator(Я прочелПример проекта кода один а такжеПример проекта кода два но все же я не знаком с этим). Пожалуйста, предложите мне генератор парсеров, который выводит парсеры C #.

Ответы на вопрос(2)

Ваш ответ на вопрос