проверить запрос предложения where в c # - PullRequest
2 голосов
/ 09 июля 2010

Мне задали этот вопрос в интервью.

Напишите ac # программу, которая распечатает все ошибки в утверждении.

(a + b == 3 and x == y or b / c == d)

Допустимые ключевые слова - это и / или скобкиразрешены и должны соответствовать.Утверждение должно быть логически правильным.Распечатайте все ошибки.

Что-то вроде компилятора или анализатора sql.

Есть идеи, как проверить синтаксис?

Ответы [ 3 ]

2 голосов
/ 09 июля 2010

Вас просят построить парсер.

Теория информатики, стоящая за компиляторами, обширна и сложна.Чтобы было проще, я рекомендую прочитать учебник по компилятору Джека Креншоу.В первых нескольких главах будет показано, как это сделать путем создания анализатора рекурсивного спуска сверху вниз.Его пример - почти то, что вы пытаетесь сделать.Он на Паскале, но все еще достаточно прост, чтобы следовать, и концепция все еще применима.

Google для "Джек Креншоу, давайте создадим компилятор", или перейдите к: http://compilers.iecc.com/crenshaw/

1 голос
/ 09 июля 2010

Совпадение скобок и скобок легко.

string expression = "(a + b + (c + d) )";

int brackets = 0;
int parenthesis = 0;
foreach(char c in expression)
{
  if(c == '(') ) parenthesis++;
  if(c == ')') ) parenthesis--;

  if(parenthesis < 0) { // ERROR!!! }
  // Same logic with brackets

}
if (parenthesis != 0) { ERROR!!! }

Кроме того, я бы использовал аналогичный подход с «операторами слияния» (+, -, *, /) и «операторами сравнения» (==,! =, <, <=, ...) </p>

За каждым словом в вашем выражении могут следовать только несколько допустимых ключевых слов.

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

В заключение отметим, что вполне нормально иметь несколько проходов для сканирования разных вещей. Первый проход - только скобки / скобки, затем проверка на что-то еще в другом цикле.

1 голос
/ 09 июля 2010

Это на самом деле довольно сложно, если вы хотите сделать это на 100% правильно. Направление исследований должно быть связано с ключевыми словами «конечные автоматы», «регулярные выражения» (не путать с Regex) и «контекстно-свободные грамматики». Также есть подход, называемый «парсер рекурсивного спуска», но сначала вам нужно понять вышеуказанные концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...