#c# #parsing
#c# #синтаксический анализ
Вопрос:
Мне нужно проанализировать многомерное выражение с помощью my .Сетевое приложение. Изначально я использовал для этого регулярные выражения, но выражения усложняются, и эксперт по регулярным выражениям предположил, что будет лучше, если я использую синтаксический анализатор.
Существует ли какой-либо анализатор специально для многомерных выражений? Я попробовал Ranet, но по какой-то неизвестной причине он не устанавливается на моем компьютере (не показывает никаких сообщений об ошибках).
Мне нужно разделить несколько частей многомерных выражений на строки. Например, предложение where в одной строке, предложение from в другой и т.д.
Комментарии:
1. Грамматика многомерных выражений чрезвычайно сложна, каковы именно ваши цели?
2. @OedipusPrime: я уже говорил, разделяя части на отдельные строки.
Ответ №1:
Лучшим решением было бы найти анализатор, но всегда очень сложно найти анализатор для ваших конкретных нужд. Итак, если вы в конечном итоге пишете синтаксический анализатор, Ve Parser — лучший инструмент по сравнению с регулярным выражением, поскольку он предоставляет больше возможностей для синтаксического анализа, вы можете генерировать лучший результат, и, поскольку вы вызываете методы .net, он неявно использует intellisence для написания вашего синтаксического анализатора. Недостатком является то, что он все еще недостаточно хорошо документирован, поэтому для некоторых специальных сценариев он может показаться сложным.
Ссылка на проект: http://veparser.codeplex.com
Идентификатор NuGet: veparser
Если вам нужно получить текст для разных частей многомерного выражения, вот частичный пример кода:
using VeParser;
using System.Linq;
using System.Collections.Generic;
using System;
public class MDXParser : TokenParser
{
protected override Parser GetRootParser()
{
// read the following line as : fill 'select' property of 'current object(which is a statement)' with the 'new value of selectStatement' after facing a sequence of a select statement and then the symbol of ( and then a delemitied list of identierfiers filling the 'fileds' property of 'current selectStatement object' delemitied by ',' and finally expect the sequence to be finished with a symbol of ')'
var selectStatement = fill("select", create<selectStatment>( seq(expectKeyword_of("select"), expectSymbol_of("("), deleimitedList(expectSymbol_of(","), fill("fields",identifier) ), expectSymbol_of(")"))));
// read the following line as : fill the from property of 'current object(which is a statement)' with an expected identifier that is after a 'from' keyword
var fromStatement = seq(expectKeyword_of("from"), fill("from", identifier));
// the following statement is incomplete, as I just wanted to show a sample bit, If you are interested I can help you complete the parser until the full documentation become available.
var whereStatement = fill("where", create<whereStatement>(seq(expectKeyword_of("where"))));
var statement = create<statement>(seq(selectStatement, fromStatement, whereStatement));
return statement;
}
public statement Parse(string code)
{
var keywords = new[] { "select", "where", "from" };
var symbols = new[] { "(",")", ".", "[", "]" };
var tokenList = Lexer.Parser(code, keywords, symbols, ignoreWhireSpaces : true);
// Now we have our string input converted into a list of tokens which actually is a list of words but with some additional information about any word, for example a "select" is marked as keyword
var parseResult = base.Parse(tokenList.tokens);
if (parseResult == null)
throw new Exception("Invalid Code, at the moment Ve Parser does not support any error reporting feature.");
else
return (statement)parseResu<
}
}
public class statement
{
public selectStatment select;
public string where;
public identifier from;
}
public class selectStatment
{
public List<identifier> fields;
}
public class whereStatement
{
}
Этот код неполный, я просто хотел продемонстрировать, как использовать Ve Parser для написания собственного анализатора для многомерных выражений. Если вам понравилась библиотека и вы хотите ее использовать, я был бы рад предоставить вам все описания и методы, которые вам нужны.
Комментарии:
1. Можете ли вы дать мне грамматику? Возможно, я мог бы реализовать грамматику в следующие выходные, если у меня будет такая возможность.
Ответ №2:
Вы могли бы взглянуть на генераторы синтаксических анализаторов, такие как http://grammatica.percederberg.net /
Хотя формулировать грамматику и поддерживать ее в актуальном состоянии — тяжелая работа.
Комментарии:
1. Спасибо, но грамматика для меня действительно сложная. 🙁