인터뷰에서이 질문을 받았습니다.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 % 제대로하고 싶다면 실제로는 꽤 복잡합니다. 연구 방향은 키워드 "유한 상태 오토마타", "정규 표현식"(Regex과 혼동하지 말 것) 및 "문맥 자유 문법"과 관련이 있습니다. 또한 "재귀 적 파서 파서 (recursive descent parser)"라는 접근법이 있지만 위의 개념을 먼저 이해해야합니다.
파서를 작성해야합니다.
컴파일러의 컴퓨터 과학 이론은 광범위하고 복잡합니다. 간단하게하기 위해 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 구문 검사기 사용법에 대해 언급 한 적이 있습니까? 왜 바퀴를 재발견합니까? –
@Hypnos 휠을 만들 수 없다면 자동차 제조업체에서 일하지 말아야합니다. – Eric
@ Eric "빌드"와 "발명"이라는 용어를 섞지 않는 이상 나는이 일화의 중요성을 알지 못합니다. –