문제

어휘 분석기가 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"과 같은 문자열은 어떤 종류의 유효/예상/분류 가능한 토큰이 아니라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top