验证在C#中的where子句查询

有人问我在一次采访中这个问题。

编写C#程序,它会在一份声明中打印出的所有错误。

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

允许的关键字和/或支架是允许的,一定要配合。 该声明必须在逻辑上是正确的。 打印出的所有错误。

像一个编译器或SQL分析仪。

不知道如何去语法检查?

--------------解决方案-------------

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

背后的编译器的计算机科学理论是广泛而复杂。 为了保持它的简单,我建议读杰克·克伦肖的编译器教程。 这将在第几章告诉你如何通过建立一个自上而下的递归下降解析器这样做正是这一点。 他的例子几乎是你想要做的事情。 它在帕斯卡​​尔,但它仍然很容易跟踪和理念仍然适用。

谷歌的“杰克克伦肖让我们构建一个编译器”,或浏览到:http://compilers.iecc.com/crenshaw/

如果你想要得到它100%正确的,实际上非常复杂。 该方向的研究将不得不做的关键词“有限状态自动机”,“正则表达式”(不要与正则表达式相混淆)和“上下文无关文法”。 另外有一个叫“递归下降分析器”的做法,但你需要首先理解上述概念。

括号匹配和括号很容易。

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

另外,我会用类似的方法与“合并报表”(+, - ,*,/)和“报表比较”(!==,=,<,<=,...)

对于你的表达式中的每一句话,只有少数几个有效的关键字可以遵循。

由于在此之前mentionned,写解析器是一项艰巨的任务,计划每个异常情况马上几乎是不可能的。 这应该是一般的想法,而不是最终的解决办法。

关于最后一点,这是完全可以拥有多遍扫描不同的事情。 第一遍是云台架/括号只,然后为您在另一个循环别的东西。

分类:C#3.0 时间:2015-03-14 人气:0
本文关键词: C#3.0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.635 (s). 10 q(s)