2010-07-08 7 views
2

인터뷰에서이 질문을 받았습니다.c에서 where 절 쿼리를 확인합니다.

성명의 모든 오류를 인쇄하는 C# 프로그램을 작성하십시오.

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

허용되는 키워드 및/또는 중괄호는 허용되며 일치해야합니다. 진술은 논리적으로 정확해야합니다. 모든 오류를 인쇄하십시오.

컴파일러 또는 SQL 분석기와 같은 것입니다.

구문 확인 방법에 대해 알고 싶습니다.

+0

FxCop 또는 StyleCop 구문 검사기 사용법에 대해 언급 한 적이 있습니까? 왜 바퀴를 재발견합니까? –

+0

@Hypnos 휠을 만들 수 없다면 자동차 제조업체에서 일하지 말아야합니다. – Eric

+0

@ Eric "빌드"와 "발명"이라는 용어를 섞지 않는 이상 나는이 일화의 중요성을 알지 못합니다. –

답변

1

실제로 100 % 제대로하고 싶다면 실제로는 꽤 복잡합니다. 연구 방향은 키워드 "유한 상태 오토마타", "정규 표현식"(Regex과 혼동하지 말 것) 및 "문맥 자유 문법"과 관련이 있습니다. 또한 "재귀 적 파서 파서 (recursive descent parser)"라는 접근법이 있지만 위의 개념을 먼저 이해해야합니다.

2

파서를 작성해야합니다.

컴파일러의 컴퓨터 과학 이론은 광범위하고 복잡합니다. 간단하게하기 위해 Jack Crenshaw의 컴파일러 자습서를 읽는 것이 좋습니다. 처음 몇 장에서 하향식 재귀 파서를 작성하여이를 정확히 수행하는 방법을 보여줍니다. 그의 모범은 당신이하려는 일과 거의 동일합니다. 그것은 파스칼이지만, 여전히 따라하기 쉽고 개념은 여전히 ​​적용됩니다.

구글, 또는 찾아 "잭 크렌쇼의이 컴파일러를 구축하자" http://compilers.iecc.com/crenshaw/

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

또한, 나는 "문 합병"과 유사한 방법을 사용하는 것

표현식의 각 단어에 대해 유효한 키워드가 몇 개만 있습니다.

이전에 언급했듯이 파서 작성은 어려운 작업이므로 모든 예외 상황을 즉시 계획하는 것은 거의 불가능합니다. 이는 결정적인 해결책이 아닌 일반적인 아이디어입니다.

마지막으로, 여러 가지 패스를 사용하여 여러 가지 사항을 검색해도 괜찮습니다. 첫 번째 패스는 대괄호/괄호 만 사용하고 다른 루프에서는 다른 것을 확인합니다.