"토큰 라이저", "파서"및 "렉서"가 무엇인지 그리고 이들이 서로 어떻게 관련되고 사용되는지에 대한 명확한 정의를 찾고 있습니까?


151

"토큰 라이저", "파서"및 "렉서"가 무엇이며 서로 어떻게 관련되어 있는지에 대한 명확한 정의를 찾고 있습니다 (예 : 파서에서 토크 나이저를 사용하거나 그 반대)? 데이터 선언 및 정의를 추출하기 위해 c / h 소스 파일을 통과하는 프로그램을 만들어야합니다.

나는 예제를 찾고 정보를 찾을 수 있지만 문법 규칙, 구문 분석 트리 및 추상 구문 트리와 같은 기본 개념을 이해하고 서로 상호 관계를 맺는 방법을 실제로 고심하고 있습니다. 결국 이러한 개념은 실제 프로그램에 저장해야하지만 1) 모양은 2) 일반적인 구현이 있습니다.

Lex 및 Yacc와 같은 이러한 주제와 프로그램에 대해 Wikipedia를 살펴 봤지만 컴파일러 클래스 (EE 전공)를 겪어 본 적이 없어서 무슨 일이 일어나고 있는지 완전히 이해하기가 어렵습니다.

답변:


166

토크 나이 저는 일반적으로 공백 (탭, 공백, 줄 바꾸기)을 찾아 텍스트 스트림을 토큰으로 나눕니다.

어휘 분석기는 기본적으로 토크 나이저이지만 일반적으로 토큰에 추가 컨텍스트를 연결합니다.이 토큰은 숫자이고 토큰은 문자열 리터럴이며 다른 토큰은 항등 연산자입니다.

파서는 렉서에서 토큰 스트림을 가져 와서 원래 텍스트로 표시되는 (일반적으로) 프로그램을 나타내는 추상 구문 트리로 바꿉니다.

마지막으로 확인한 주제에 대한 가장 좋은 책은 "컴파일러 : 원칙, 기술 및 도구"로 보통 "드래곤 북"으로 알려져 있습니다.


8
의심 할 여지없이 "The Dragon Book"은 좋은 책이지만 독자는 CS에 대한 좋은 근거가 필요합니다. 보다 실용적인 호소력을 가진 책은 Ronald Mak의 "작성 컴파일러 및 통역사", "Modern Compiler Implementation", Andrew Appel입니다. "컴파일러 구성", Niklaus Wirth; Pat Terry의 "C # 및 Java로 컴파일"및 "컴파일러 및 컴파일러 생성기 : C ++ 소개"; 그리고 Terrence Parr의 "The Definitive ANTLR Reference".
Andre Artus

5
확실하게, 나는 당신의 추천을 두드리지 않습니다. "The Dragon Book"은 컴파일러 기술에 대한 첫 번째 책이지만 Wirth의 책과 비교하기는 쉽지 않았습니다. Wirth의 책은 몇 시간 만에 읽을 수있는 책입니다. 그 당시에는 제가 손에 넣을 수있는 유일한 책 이었으므로 옵션이 거의 없었습니다 (1991 년, 아마존과 WWW 이전). 나는 Jack W. Crenshaw가 제작 한 "LET 'S BUILD A COMPILER"(Jack 덕분에)라는 텍스트 파일을 가지고있었습니다. 이 책은 여전히 ​​원리를 더 완벽하게 이해하기위한 책이지만 대부분의 프로그래머는 실용적 소개가 필요합니다.
Andre Artus

10
파서 / by definition /이 추상 구문 트리를 생성한다는 데 동의하지 않습니다. 파서는 모든 종류의 다른 출력을 생성 할 수 있습니다. 예를 들어, 파서가 일부 빌더 인터페이스에 대한 일련의 호출을 생성하는 것이 일반적입니다 (4 가지 패턴의 안내서에서 빌더 패턴 참조). 요점은 파서가 일련의 토큰을 분석하여 시퀀스가 ​​일부 (일반적으로 컨텍스트가없는) 문법을 따르는 지 여부를 결정하고 시퀀스의 문법 구조에 따라 일부 출력을 생성 할 수 있다는 것입니다.
Theodore Norvell

2
"하자 빌드 컴파일러는"여기에 있습니다 : compilers.iecc.com/crenshaw . 여기에서 링크를 찾았습니다 : prog21.dadgum.com/30.html
Roger Lipscombe

1
@Pithkos : 이것이 유일한 제약 조건이라면, 함수가 이름이없는 (수학적) 도메인에서 입력을 취하고 다른 unamed 도메인에서 생성 및 출력하는 것입니다 (예 : F (X)-> Y 거의 대부분의 의미 이것을 "함수"라고 부를 수 있습니다. X의 도메인이 <StreamOfCharacter, Grammar>이고 Y의 도메인이 문법의 모양을 반영하는 속성을 가진 Tree 인 경우 F (X, G)-> T는 파서. G는 자주 변하지 않기 때문에 G와 관련하여 F를 카레하는 경우가 많으므로 F [G] (X)-> T는 일반적으로 파서로 간주됩니다.
Ira Baxter

18

예:

int x = 1;

어휘 분석기 나 토큰 화기는 토큰을 'int', 'x', '=', '1', ';'로 나눕니다.

파서는이 토큰을 가져 와서 어떤 방식 으로든 이해하는 데 사용합니다.

  • 우리는 진술이있다
  • 정수의 정의입니다
  • 정수는 'x'입니다
  • 'x'는 값 1로 초기화해야합니다.

9
어휘 분석기는 "int", "=", ";" "x"는 식별자 이름 또는 무언가, 값 "x", "1"은 정수 또는 숫자, 값 "1"이라는 추가 의미가없는 토큰입니다. 토크 나이저가 반드시 그렇게하는 것은 아닙니다.
David Thornley

5

나는 어휘 분석기와 토크 나이저가 기본적으로 같은 것이고, 그것들을 텍스트를 구성 요소 부분 ( '토큰')으로 분쇄한다고 말한다. 그런 다음 구문 분석기는 문법을 사용하여 토큰을 해석합니다.

나는 정확한 용어 사용법에 너무 매달리지 않을 것입니다. 사람들은 종종 많은 양의 텍스트를 해석하는 행동을 설명하기 위해 '구문 분석'을 사용합니다.


1
PEG 파서를 사용하면 토크 나이저와 파서의 구분이 훨씬 명확하지 않습니다.
Andre Artus

0

( 주어진 답변에 추가 )

  • 토크 나이는 것 또한 의견을 제거하고 만 돌아 토큰을 렉서에.
  • Lexer는 또한 해당 토큰의 범위를 정의합니다 (변수 / 함수)
  • 그런 다음 파서는 코드 / 프로그램 구조를 구축합니다

1
안녕하세요 @ downvoter, 실제로 downvote를 한 이유를 자세히 설명해 주시겠습니까?
Koray Tugay

1
나는 downvoter는 아니지만 downvote는 귀하의 답변이 정확하지 않은 것으로 생각됩니다. 토크 나이저 (tokenizer)는 노이즈를 제거 할 수 있지만 (일반적으로 공백이지만 주석도있을 수 있음) 종종 어휘 분석기를 먹지 않습니다. DFA 기반 어휘 분석기는 토큰 화 및 토큰 (예 : 숫자, 문자열, 식별자, 공백 또는 주석)을 식별하지만 나중에이를 구성하는 구문 트리가 필요하므로 범위를 지정할 수 없습니다. 파서.
Lucero

1) "lexer"와 "tokenizer"의 차이점을 이해하지 못합니다. 나는 50 개 이상의 언어에 대한 파서를 만들었고 소스 텍스트를 원자로 나누는 두 개의 분리 된 메커니즘을 가지고 있지 않았으므로 나에게 이것은 동의어 일 뿐이다. 2) 컴파일하는 경우 어휘 분석기에서 주석과 공백을 제거하는 것이 좋습니다. 소스-소스 변환 도구를 빌드하는 경우 변환 된 텍스트에 주석이 다시 나타나야하므로 주석을 잃을 수 없습니다. 따라서 주석을 제거하는 것은 항상 잘못된 것입니다. 공백을 보존하기 위해 어떻게 관리하는지에 대해 논쟁 할 수 있습니다. ...
Ira Baxter

1
... [내가 구축 한 도구 (바이오 참조)는 변환 된 코드로 도구를 재현하기에 충분한 충실도로 캡처합니다. 더 나아가서 사용자가 변환 된 결과를 거부하는 것을 피하기 위해 문자열에 사용 된 따옴표 및 숫자에 대한 기수 / 제로 카운트와 같은 이상한 것들을 포함하여 원자 의 형식 을 캡처합니다 . 따라서 당신이 놓친 것은 렉서가 반드시 정보를 제거 할뿐만 아니라 실제로 원시 토큰 이상의 정보를 캡처해야 할 수도 있다는 것이다. ....
Ira Baxter

... 3) Lexers는 구문 상 모호성을 처리하는 데 어려움을 겪는 절망적으로 어색한 파서에서만 "범위"를 정의합니다. C 및 C ++ 파서는 표준 예입니다. stackoverflow.com/a/1004737/120163 에서 내 토론을 참조하십시오 ). 그렇게 (추악한) 방식으로 할 필요는 없습니다. 그래서 나는 당신의 대답이 단순히 잘못 인도 된 것을 발견했습니다.
Ira Baxter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.