맞아요. 컴파일러의 Front-End는 주로 소스 코드의 **문법적 정확성(Syntax)**을 검증하는 단계인데, 그 중에서도 **Lexer(어휘 분석기)**와 **Parser(구문 분석기)**는 서로 다른 수준에서 문법을 검증합니다.
항목 | Lexer (Lexical Analyzer) | Parser (Syntax Analyzer) |
---|---|---|
역할 | 소스 코드를 토큰(token) 단위로 나눔 | 토큰의 배열이 문법(Grammar)에 맞는지 검증 |
검증하는 문법 수준 | 어휘 수준(Lexical Syntax) | 구문 수준(Context-Free Syntax) |
주로 처리하는 것 | 키워드, 식별자, 숫자, 연산자 등 단위 식별 | 문장 구조(예: if문, 함수 정의 등) 분석 |
사용하는 규칙 | 정규 표현식(Regular Expressions) 기반 | 문맥 자유 문법(Context-Free Grammar) 기반 |
에러 예시 | @ 같은 허용되지 않은 문자가 있을 때123abc 같은 잘못된 식별자 |
괄호 짝이 안 맞거나if 다음에 조건이 빠졌을 때 |
예시 입력 | int x = 10; → int , x , = , 10 , ; 로 분해 |
위 토큰들이 변수 선언 문법에 맞는지 확인 |
코드 예시 | 설명 | 누가 잡아냄 |
---|---|---|
int @value = 5; |
@ 는 유효한 식별자 문자가 아님 |
Lexer |
float 1num = 3.14; |
식별자는 숫자로 시작할 수 없음 | Lexer |
string name = "Hello; |
문자열 리터럴이 닫히지 않음 | Lexer |
char c = 'ab'; |
문자 리터럴은 한 글자여야 함 | Lexer |
int x = 0xZZZZ; |
16진수에 유효하지 않은 문자 포함 | Lexer |
코드 예시 | 설명 | 누가 잡아냄 |
---|---|---|
if (x > 0 |
괄호 닫힘 없음 | Parser |
while x < 10) {} |
여는 괄호 ( 없음 |
Parser |
int x = ; |
초기화 값 없이 세미콜론 | Parser |
for (int i = 0; i < 10 i++) |
세미콜론 빠짐 | Parser |
int x y = 5; |
타입 선언과 변수 사이에 구문 오류 | Parser |
return |
세미콜론 빠짐 or 반환 값 필요 | Parser |
if (x > 0) else {} |
if의 본문이 없음 | Parser |
func(a, , b) |
인자 목록 중 쉼표 위치 오류 | Parser |