2011-05-09 4 views
7

제목은 "lexer"및 "parser"단어가 동의어인지 또는 다른 단어인지 질문하는 것입니다. Wikipedia가이 단어를 서로 바꾸어 사용하는 것 같지만 영어가 모국어가 아니므로 확신 할 수 없습니다."lexer"라는 단어가 "parser"라는 단어와 동의어입니까?

+1

"렉서"는 때로 "토큰 화기"또는 "스캐너"라고도합니다. –

+0

@Bart 감사합니다. 실수로 질문을 잘못 작성했습니다. 나는 "lexer가 tokenizer와 동의어인가"라는 의미이므로 주석이 실제로 답변입니다. 감사. –

+0

:) 안녕하세요. –

답변

7

아니요. Lexer는 입력 스트림을 "단어"로 분해합니다. 파서는 그러한 "단어"사이의 구문 구조를 발견합니다. 예를 들어, 주어진 입력 :

velocity (identifier) 
= (assignment operator) 
path (identifier) 
/(binary operator) 
time (identifier) 
; (statement separator) 

다음, 파서는 다음 구조를 확립 할 수 :

velocity = path/time; 

렉서 출력은 렉서의 입력을 분리하는 데 사용되는

= (assign) 
    lvalue: velocity 
    rvalue: result of 
    /(division) 
     dividend: contents of variable "path" 
     divisor: contents of variable "time" 
6

아니요. lexer는 소스 텍스트를 토큰으로 분해하지만 파서는 토큰 시퀀스를 적절하게 해석합니다.

8

을 파서는 토큰 시퀀스에서 추상 구문 트리를 구성하는 데 사용됩니다.

이제 토큰은 단순한 문자이고 파서를 직접 사용한다고 말할 수 있습니다.하지만 다음에 수행 할 작업을 결정하기 위해 토큰 하나만 살펴 봐야하는 파서를 사용하는 것이 편리합니다. 따라서 구문 분석기는 구문 분석기가 입력하기 전에 입력을 토큰으로 나눌 때 보통 렉서 (lexer)를 사용합니다.

보통 렉서는 순서대로 테스트되는 간단한 정규식 규칙을 사용하여 설명됩니다. 이러한 설명에서 자동으로 렉서를 생성 할 수있는 도구가 있습니다 (예 : lex).

[0-9]+ Number 
[A-Z]+ Identifier 
+  Plus 

파서 한편, 일반적 문법을 지정하여 설명한다. 다시 말하면, 그러한 설명으로부터 파서를 생성 할 수있는 yacc과 같은 도구가 존재합니다.

expr ::= expr Plus expr 
     | Number 
     | Identifier 
3

그들은 다릅니다.

렉서는 입력 문자 스트림을 입력으로 사용하여 출력으로 토큰 (일명 "어휘")을 생성합니다.

구문 분석기는 토큰 (어휘)을 입력으로 사용하여 구문을 나타내는 추상 구문 트리를 생성합니다.

두 사람은 모두 비슷하지만 상당수의 사람들 (특히 컴파일러 나 통역사 같은 것을 작성한 적이없는 사람들)은 같은 것으로 취급하거나 (더 자주) "파서"를 사용합니다 정말로 "렉서"를 의미합니다.

1

내가 아는 한, 렉서와 파서는 의미가 있지만 동음 이의어는 정확한 동의어는 아닙니다. 많은 출처가 비슷한 언어를 사용하지만, 렉서 (lexical analyzer의 약어)는 입력과 관련하여 토큰을 식별합니다. 파서는 토큰 스트림이 고려중인 언어의 문법을 충족시키는 지 여부를 결정합니다.

관련 문제