我在面試中被問到這個問題。在c#中驗證where子句查詢
編寫一個c#程序,它將打印出語句中的所有錯誤。
(a + b == 3 and x == y or b/c == d)
允許的關鍵字是和/或,大括號是允許和必須匹配的。聲明必須在邏輯上正確。打印出所有的錯誤。
類似於編譯器或sql分析器。
任何想法如何去語法檢查?
我在面試中被問到這個問題。在c#中驗證where子句查詢
編寫一個c#程序,它將打印出語句中的所有錯誤。
(a + b == 3 and x == y or b/c == d)
允許的關鍵字是和/或,大括號是允許和必須匹配的。聲明必須在邏輯上正確。打印出所有的錯誤。
類似於編譯器或sql分析器。
任何想法如何去語法檢查?
如果你想讓它100%正確,那實際上很複雜。研究的方向與關鍵字「有限狀態自動機」,「正則表達式」(不要與正則表達式混淆)和「上下文無關語法」有關。還有一種叫做「遞歸下降解析器」的方法,但你首先需要理解上述概念。
您被要求構建解析器。
編譯器背後的計算機科學理論是廣泛而複雜的。爲了簡單起見,我推薦閱讀Jack Crenshaw的編譯器教程。它將在前幾章中向您展示如何通過構建自頂向下的遞歸下降解析器來完成此操作。他的例子幾乎就是你想要做的。它在帕斯卡爾,但它仍然很容易遵循,這個概念仍然適用。
谷歌爲「傑克·克倫肖讓我們建立一個編譯」,或瀏覽到: http://compilers.iecc.com/crenshaw/
括號匹配和括號是容易的。
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!!! }
而且,我會用類似的方法與 「合併報表」(+, - ,*,/)和 「報表比較」(==,=,<,< = ......!)
對於表達式中的每個單詞,只能使用幾個有效的關鍵字。
正如之前提到的,編寫解析器是一項艱鉅的任務,立即規劃每個異常情況幾乎是不可能的。這應該是總體思路,而不是一個確定的解決方案。
在最後一個提示中,有多個通道掃描不同的東西是完全可以的。第一遍只是括號/括號,然後檢查另一個循環中的其他內容。
他們提到了FxCop或StyleCop語法檢查器的用法嗎?爲什麼重新發明輪子? – 2010-07-08 23:20:32
@Hypnos如果你不能建造一個車輪,你不應該爲汽車製造商工作 – Eric 2010-07-09 00:13:03
@Eric我沒有看到這個軼事的意義,除非你混合使用術語「構建」和「發明」。 – 2010-07-11 13:28:28