验证c#中的where子句查询

时间:2010-07-08 23:09:04

标签: c#-3.0

我在接受采访时被问到这个问题。

编写一个c#程序,它将打印出一个语句中的所有错误。

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

允许的关键字是和/或,大括号是允许的,必须匹配。声明必须在逻辑上正确。打印出所有错误。

像编译器或sql分析器。

知道如何进行语法检查吗?

3 个答案:

答案 0 :(得分:2)

你被要求建立一个解析器。

编译器背后的计算机科学理论是广泛而复杂的。为了简单起见,我建议阅读Jack Crenshaw的编译器教程。它将在前几章中向您展示如何通过构建自上而下的递归下降解析器来完成此操作。他的榜样几乎就是你想要做的。它在Pascal中,但它仍然很容易遵循,这个概念仍然适用。

Google for“jack crenshaw让我们构建一个编译器”,或浏览到: http://compilers.iecc.com/crenshaw/

答案 1 :(得分:1)

如果你想让它100%正确,那实际上非常复杂。研究的方向将与关键词“有限状态自动机”,“正则表达式”(不要与正则表达式混淆)和“无上下文语法”有关。还有一种称为“递归下降解析器”的方法,但您需要首先理解上述概念。

答案 2 :(得分:1)

匹配括号和括号很容易。

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!!! }

另外,我会使用类似的方法与“语句合并”(+, - ,*,/)和“语句比较器”(==,!=,&lt;,&lt; =,...)

对于表达式中的每个单词,只能跟随几个有效的关键字。

如前所述,编写解析器是一项艰巨的任务,不可能立即计划每个例外情况。这应该是一般的想法,而不是一个明确的解决方案。

最后一点,完全可以让多个传球来扫描不同的东西。第一遍只是括号/括号,然后在另一个循环中检查其他内容。