어휘 분석기가 감지 할 수있는 오류의 몇 가지 예는 무엇입니까?
-
20-09-2019 - |
문제
어휘 분석기가 Java, C ++ 또는 C와 같은 언어로 주어진 코드에서 감지 할 수있는 오류의 일부 예는 무엇입니까?
해결책
Lexer는 가능한 의미가없는 문자 시퀀스를 감지 할 수 있습니다 (파서에 의해 의미가 결정되는 경우). 예를 들어, Java에서는 시퀀스입니다 bana"na
식별자, 키워드, 운영자 등이 될 수 없습니다.
그러나 Lexer는 주어진 어휘 유효 토큰이 의미가 없거나 문법적이지 않다는 것을 감지 할 수 없습니다. 예를 들어, Java Lexer는 행복하게 일련의 토큰을 반환 할 것입니다. final "banana" final "banana"
, 키워드, 문자열 상수, 키워드 및 문자열 상수가 각각 나타납니다.
다른 팁
아래에 언급 된 사례 외에도 대부분의 컴파일러는 Lexer의 의견을 처리합니다. 따라서 오류 wrt 댓글 (부적절하게 중첩되어 닫히지 않음)도 여기에서 감지 할 수 있습니다.
또 다른 문제는 Lexer와 Parser가 함께 처리 해야하는 사용자 정의 데이터 유형의 경우입니다. 다음 코드를 고려하십시오.
typedef int myinteger; Myinteger x;
두 번째 문서에서 MyInteger는 데이터 유형이며 Lexer는 MyInteger를 계약자가 아닌 데이터 유형으로 반환해야합니다. 이는 일반적으로 Parser에 의해 이전에 채워진 목록 사용자 정의 데이터 유형을 사용하여 잠재적 인 계약자를 교차 참조하여 수행됩니다.
세 번째 문제는 토큰의 맥락에 관한 것입니다. C ++와 같은 상황에 관계없이 언어를 사용하면 동일한 토큰 (예 : <)은 다른 의미 (템플릿 매개 변수의 시작보다 작음)를 가질 수 있습니다. 이것은 또한 파서와 협력하여 처리되어야하며, 이는 현재 상태에서 Lexer에게 피드백을 줄 수 있습니다.
나는 문법을 두 번 확인하지 않았지만 "2cat"과 같은 문자열은 어떤 종류의 유효/예상/분류 가능한 토큰이 아니라고 생각합니다.