제목은 "lexer"및 "parser"단어가 동의어인지 또는 다른 단어인지 질문하는 것입니다. Wikipedia가이 단어를 서로 바꾸어 사용하는 것 같지만 영어가 모국어가 아니므로 확신 할 수 없습니다."lexer"라는 단어가 "parser"라는 단어와 동의어입니까?
답변
아니요. 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"
아니요. lexer는 소스 텍스트를 토큰으로 분해하지만 파서는 토큰 시퀀스를 적절하게 해석합니다.
을 파서는 토큰 시퀀스에서 추상 구문 트리를 구성하는 데 사용됩니다.
이제 토큰은 단순한 문자이고 파서를 직접 사용한다고 말할 수 있습니다.하지만 다음에 수행 할 작업을 결정하기 위해 토큰 하나만 살펴 봐야하는 파서를 사용하는 것이 편리합니다. 따라서 구문 분석기는 구문 분석기가 입력하기 전에 입력을 토큰으로 나눌 때 보통 렉서 (lexer)를 사용합니다.
보통 렉서는 순서대로 테스트되는 간단한 정규식 규칙을 사용하여 설명됩니다. 이러한 설명에서 자동으로 렉서를 생성 할 수있는 도구가 있습니다 (예 : lex
).
[0-9]+ Number
[A-Z]+ Identifier
+ Plus
파서 한편, 일반적 문법을 지정하여 설명한다. 다시 말하면, 그러한 설명으로부터 파서를 생성 할 수있는 yacc
과 같은 도구가 존재합니다.
expr ::= expr Plus expr
| Number
| Identifier
그들은 다릅니다.
렉서는 입력 문자 스트림을 입력으로 사용하여 출력으로 토큰 (일명 "어휘")을 생성합니다.
구문 분석기는 토큰 (어휘)을 입력으로 사용하여 구문을 나타내는 추상 구문 트리를 생성합니다.
두 사람은 모두 비슷하지만 상당수의 사람들 (특히 컴파일러 나 통역사 같은 것을 작성한 적이없는 사람들)은 같은 것으로 취급하거나 (더 자주) "파서"를 사용합니다 정말로 "렉서"를 의미합니다.
내가 아는 한, 렉서와 파서는 의미가 있지만 동음 이의어는 정확한 동의어는 아닙니다. 많은 출처가 비슷한 언어를 사용하지만, 렉서 (lexical analyzer의 약어)는 입력과 관련하여 토큰을 식별합니다. 파서는 토큰 스트림이 고려중인 언어의 문법을 충족시키는 지 여부를 결정합니다.
"렉서"는 때로 "토큰 화기"또는 "스캐너"라고도합니다. –
@Bart 감사합니다. 실수로 질문을 잘못 작성했습니다. 나는 "lexer가 tokenizer와 동의어인가"라는 의미이므로 주석이 실제로 답변입니다. 감사. –
:) 안녕하세요. –