어휘 분석

Lexical analysis

어휘 토큰화는 "lexer" 프로그램에 의해 정의된 범주에 속하는 의미 있는 어휘 토큰으로 텍스트를 변환하는 것입니다.자연어의 경우, 그러한 범주에는 명사, 동사, 형용사, 구두점 등이 포함됩니다.프로그래밍 언어의 경우 범주에는 식별자, 연산자, 그룹 기호 및 데이터 유형이 포함됩니다.어휘 토큰화는 바이트인코딩을 사용하여 텍스트를 숫자 토큰으로 인코딩하는 대규모 언어 모델의 데이터 전처리에 사용되는 확률적 토큰화와 동일한 프로세스가 아닙니다.

규칙 기반 프로그램

어휘 토큰화를 수행하는 규칙 기반 프로그램은 토큰화기 [1]또는 스캐너라고 하며, 스캐너는 어휘 사용자의 첫 번째 단계를 가리키는 용어이기도 합니다.렉서는 프로세싱에서 컴파일러 프런트엔드의 첫 번째 단계를 형성합니다.분석은 일반적으로 한 번에 이루어집니다.렉서와 파서는 컴파일러에 가장 많이 사용되지만 예쁜 프린터나 린터와 같은 다른 컴퓨터 언어 도구에도 사용될 수 있습니다.렉싱은 두 단계로 나눌 수 있습니다. 즉, 입력 문자열을 렉시엠이라는 구문 단위로 분할하여 토큰 클래스로 분류하는 스캔과 렉시엠을 처리된 값으로 변환하는 평가입니다.

어휘는 일반적으로 매우 단순하며, 대부분의 복잡성은 파서 또는 의미 분석 단계로 지연되며, 어휘 또는 파생물과 같은 어휘 생성기에 의해 생성될 수 있습니다.그러나 어휘는 때때로 입력을 더 쉽게 하고 파서를 단순화하기 위한 구문 구조 처리와 같은 복잡성을 포함할 수 있으며, 더 많은 기능을 지원하거나 성능을 위해 부분적으로 또는 전체적으로 손으로 작성될 수 있습니다.

어휘소의 명확화

규칙 기반 자연어 처리에서 "렉셈"이라고 불리는 것은 언어학에서 렉셈이라고 불리는 것과 같지 않습니다.규칙 기반 자연어 처리에서 "lexeme"라고 불리는 것은 영어와 같은 분석 언어에서만 언어학적으로 동등할 수 있지만 융합 언어와 같은 고도로 합성된 언어에서는 그렇지 않습니다.규칙 기반 자연어 처리에서 어휘소라고 불리는 것은 언어학에서 단어라고 불리는 것과 더 유사합니다(컴퓨터 구조에서 단어와 혼동하지 마십시오). 경우에 따라 형태소와 더 유사할 수도 있습니다.

어휘 토큰화 및 어휘 토큰화

어휘 토큰은 큰 언어 모델에서 사용되는 확률론적 토큰과 달리 할당되어 식별된 의미를 가진 문자열입니다.어휘 토큰은 토큰 이름과 선택적 토큰 값으로 구성됩니다.토큰 이름은 규칙 기반 어휘 [2]단위의 범주입니다.일반적인 토큰 이름은 다음과 같습니다.

  • 식별자: 프로그래머가 선택한 이름;
  • 키워드: 이미 프로그래밍 언어로 된 이름;
  • 구분자(점화기라고도 함): 문장 부호 문자 및 쌍체 구분자;
  • 연산자: 인수에서 작동하고 결과를 생성하는 기호;
  • 리터럴: 숫자, 논리, 텍스트, 참조 리터럴;
  • comment: line, block (컴파일러가 주석을 토큰으로 구현하는 경우 컴파일러에 따라 다릅니다. 그렇지 않으면 삭제됩니다.)
토큰 값의 예
토큰명 토큰 값 샘플
식별자 x,color,UP
키워드 if,while,return
구분자 },(,;
교환입니다. +,<,=
문자 그대로의 true,6.02e23,"music"
댓글 /* Retrieves user data */,// must be negative

C 프로그래밍 언어에서 다음 식을 고려합니다.

x = a + b * 2;

이 표현식의 어휘 분석은 다음과 같은 토큰 시퀀스를 생성합니다.

[(identifier, x), (operator, =), (identifier, a), (operator, +), (identifier, b), (operator, *), (literal, 2), (separator, ;)]

토큰 이름은 언어학에서 음성의 일부라고 할 수 있는 것입니다.

어휘 토큰화는 식별자, 연산자, 그룹화 기호 및 데이터 유형과 같은 "lexer" 프로그램에 의해 정의된 범주에 속하는 원시 텍스트를 의미 있는 어휘 토큰으로 변환하는 것입니다.그런 다음 결과 토큰은 다른 형태의 처리로 전달됩니다.이 프로세스는 입력을 구문 분석하는 하위 작업으로 간주될 수 있습니다.

예를 들어, 텍스트 문자열에서:

The quick brown fox jumps over the lazy dog

문자열은 자연어 화자가 하는 것처럼 공간에서 암묵적으로 분할되지 않습니다.원시 입력(43자)은 지정된 공백 구분 기호(즉, 문자열 일치)를 사용하여 9개 토큰으로 명시적으로 분할해야 합니다." "또는 정규식 /\s{1}/).

토큰 클래스가 하나 이상의 가능한 어휘소를 나타낼 때, 어휘소는 종종 원래의 어휘소를 재현하기에 충분한 정보를 저장하여 의미 분석에 사용할 수 있습니다.파서는 일반적으로 이 정보를 렉서에서 검색하여 추상 구문 트리에 저장합니다.이것은 숫자가 유효한 식별자일 수도 있는 경우 정보 손실을 방지하기 위해 필요합니다.

토큰은 렉서의 특정 규칙을 기반으로 식별됩니다.토큰을 식별하는 데 사용되는 몇 가지 방법에는 정규식, 플래그라고 하는 문자의 특정 시퀀스, 구분 기호라고 하는 특정 구분 문자, 사전에 의한 명시적 정의 등이 있습니다.구두점 문자를 포함한 특수 문자는 쓰기 및 프로그래밍 언어에서 자연스럽게 사용되기 때문에 일반적으로 토큰을 식별하는 데 사용됩니다.어휘 분석기는 일반적으로 구문 분석기에 남아 있는 작업인 토큰의 조합으로 아무 일도 하지 않습니다.예를 들어, 일반적인 어휘 분석기는 괄호를 토큰으로 인식하지만 각 "(")가 ""와 일치하는지 확인하는 데는 아무런 도움이 되지 않습니다.

어휘 사용자가 구문 분석기에 토큰을 공급할 때 사용되는 표현은 일반적으로 숫자 표현의 열거된 목록입니다.예를 들어, "식별자"는 0, "할당 연산자"는 1, "추가 연산자"는 2 등으로 표시됩니다.

토큰은 종종 정규식으로 정의되며, 이는 lex와 같은 어휘 분석기 생성기에 의해 이해됩니다.어휘 분석기(lex 또는 수공예와 같은 도구에 의해 자동으로 생성됨)는 문자 스트림을 읽고 스트림에서 어휘소를 식별한 후 토큰으로 분류합니다.이를 토큰화라고 합니다.렉서가 잘못된 토큰을 발견하면 오류를 보고합니다.

토큰화 다음은 구문 분석입니다.여기서 해석된 데이터는 일반적인 사용, 해석 또는 컴파일을 위해 데이터 구조에 로드될 수 있습니다.

어휘 문법

프로그래밍 언어의 사양은 종종 어휘 문법을 정의하는 일련의 규칙을 포함합니다.어휘 구문은 일반적으로 정규 표현식으로 구성된 문법 규칙을 사용하여 토큰의 가능한 문자 시퀀스(격소) 집합을 정의합니다.렉서는 문자열을 인식하고 발견된 문자열의 각 종류에 대해 가장 단순하게 토큰을 생성하는 작업을 수행합니다.

두 가지 중요한 공통 어휘 범주공백과 주석입니다.이것들은 또한 문법에서 정의되고 렉서에 의해 처리되지만, 폐기될 수 있고(어떤 토큰도 생성하지 않음) 중요하지 않은 것으로 간주될 수 있으며, 최대 두 개의 토큰을 분리할 수 있습니다(예:if x대신에ifx) 여기에는 두 가지 중요한 예외가 있습니다.첫째, 블록을 들여쓰기로 구분하는 오프사이드 규칙 언어에서 초기 공백은 블록 구조를 결정하고 일반적으로 어휘 수준에서 처리되므로 중요합니다. 아래 구문 구조를 참조하십시오.두 번째로, 예를 들어 예쁜 프린터는 주석을 출력해야 하고 일부 디버깅 도구는 원본 소스 코드를 보여주는 메시지를 프로그래머에게 제공할 수 있습니다.1960년대, 특히 ALGOL의 경우, 공백과 주석은 라인 재구성 단계(컴파일러 프론트엔드의 초기 단계)의 일부로 제거되었지만, 이러한 별도 단계는 제거되었으며 현재는 렉서에 의해 처리됩니다.

세부 사항

스캐너

첫 번째 단계인 스캐너는 일반적으로 유한 상태 기계(FSM)를 기반으로 합니다.처리하는 토큰 내에 포함될 수 있는 문자 시퀀스에 대한 정보를 암호화합니다(이러한 문자 시퀀스의 개별 인스턴스를 어휘소라고 함).예를 들어 정수 어휘소에는 숫자 문자의 순서가 모두 포함될 수 있습니다.대부분의 경우 공백이 아닌 첫 번째 문자를 사용하여 토큰 유형을 추론한 다음 해당 토큰에 허용되지 않는 문자 집합에 도달할 때까지 한 번에 하나씩 후속 입력 문자를 처리할 수 있습니다(이를 최대 뭉크 또는 가장 긴 일치 규칙이라고 함).일부 언어에서는 어휘소 생성 규칙이 더 복잡하며 이전에 읽은 문자에 대한 역추적이 포함될 수 있습니다.예를 들어, C에서 'L' 문자 하나만으로는 'L'로 시작하는 식별자와 넓은 문자열 리터럴을 구별할 수 없습니다.

평가자

그러나 어휘소는 특정 종류의 문자(예: 문자열 리터럴, 문자 시퀀스)로 알려진 문자열일 뿐입니다.토큰을 구성하기 위해 어휘 분석기는 두 번째 단계인 평가자가 필요합니다. 평가자는 어휘소의 문자를 검토하여 을 생성합니다.어휘소의 유형과 그 값이 결합된 것은 구문 분석기에 제공될 수 있는 토큰을 적절하게 구성하는 것입니다.괄호와 같은 일부 토큰에는 값이 없으므로 이에 대한 평가자 기능은 값을 반환할 수 없습니다. 유형만 필요합니다.마찬가지로, 때때로 평가자는 어휘소를 파서로부터 숨기고 완전히 억제할 수 있으며, 이는 공백 및 주석에 유용합니다.식별자에 대한 평가자는 일반적으로 단순하지만(문자 그대로 식별자를 나타냄) 일부 중단을 포함할 수 있습니다.정수 리터럴에 대한 평가자는 문자열을 전달하거나(평가를 의미 분석 단계로 연기) 평가를 직접 수행할 수 있으며, 이는 서로 다른 기저 또는 부동 소수점 번호에 대해 포함될 수 있습니다.단순 따옴표로 묶인 문자열 리터럴의 경우 평가자는 따옴표만 제거하면 되지만 이스케이프된 문자열 리터럴의 평가자는 렉서를 통합하여 이스케이프 시퀀스를 해제합니다.

예를 들어, 컴퓨터 프로그램의 소스 코드에서 문자열은

net_worth_future = (assets liabilities);

다음과 같은 어휘 토큰 스트림으로 변환될 수 있습니다. 공백은 표시되지 않으며 특수 문자에는 값이 없습니다.

식별자 net_worth_future는 Open_Parentheis 식별자 자산에서 식별자 부채를 뺀 값입니다.

기존 파서의 라이센스 제한으로 인해 렉서를 손으로[citation needed] 작성해야 할 수도 있습니다.토큰 목록이 적으면 실용적이지만 일반적으로 자동화된 도구에 의해 생성됩니다.이러한 도구는 일반적으로 입력 스트림에서 허용되는 토큰을 설명하는 정규식을 허용합니다.각 정규식은 정규식과 일치하는 어휘소를 평가하는 프로그래밍 언어의 어휘 문법의 생성 규칙과 연결됩니다.이러한 도구는 컴파일 및 실행이 가능한 소스 코드를 생성하거나 유한 상태 시스템(컴파일 및 실행을 위해 템플릿 코드에 연결됨)에 대한 상태 전환 테이블을 구성할 수 있습니다.

정규식은 어휘소의 문자가 따를 수 있는 패턴을 압축적으로 나타냅니다.예를 들어 영어 기반 언어의 경우 IDENTIFIER 토큰은 영어 알파벳 문자 또는 밑줄, 그 뒤에 ASCII 영숫자 및/또는 밑줄 인스턴스가 있을 수 있습니다.이는 문자열로 압축하여 표현할 수 있습니다.[a-zA-Z_][a-zA-Z_0-9]*이것은 "a-z, A-Z 또는 _ 문자 뒤에 0 이상의 a-z, A-Z, _ 또는 0-9"를 의미합니다.

정규식과 이들이 생성하는 유한 상태 시스템은 "n개의 여는 괄호 뒤에 문, n개의 닫는 괄호 에 오는 괄호"와 같은 재귀적 패턴을 처리하기에 충분히 강력하지 않습니다.이들은 n에 대해 허용되는 값의 유한 집합이 존재하지 않는 한 카운트를 유지할 수 없으며 n이 양쪽에서 동일한지 확인할 수 없습니다.이러한 패턴을 전체 일반적으로 인식하려면 전체 파서가 필요합니다.파서는 스택에서 괄호를 누른 다음 괄호를 팝업하여 스택이 끝에 비어 있는지 확인할 수 있습니다(컴퓨터 프로그램의 구조해석 책의 예 참조[3]).

장애물

일반적으로 어휘 토큰화는 단어 수준에서 발생합니다.그러나 "단어"가 무엇을 의미하는지 정의하는 것은 때때로 어렵습니다.토큰화기는 종종 다음과 같은 간단한 휴리스틱에 의존합니다.

  • 구두점과 공백은 결과 토큰 목록에 포함되거나 포함되지 않을 수 있습니다.
  • 알파벳 문자의 모든 연속 문자열은 하나의 토큰의 일부이며 숫자도 마찬가지입니다.
  • 토큰은 공백이나 줄 바꿈과 같은 공백 문자 또는 구두점 문자로 구분됩니다.

대부분의 라틴 알파벳 및 대부분의 프로그래밍 언어와 같이 단어 간 공간을 사용하는 언어에서는 이러한 접근 방식이 매우 간단합니다.그러나 여기서도 축약, 하이픈으로 연결된 단어, 이모티콘URI와 같은 더 큰 구조(일부 목적에서는 단일 토큰으로 계산될 수 있음)와 같은 많은 에지 사례가 있습니다.전형적인 예는 "뉴욕 기반"으로, 순진한 토큰화자는 하이픈에 더 나은 브레이크가 있음에도 불구하고 그 공간에서 깨질 수 있습니다.

토큰화고대 그리스어, [4]중국어 또는 태국어와 같은 단어 경계를 나타내지 않는 스크립트 연속체로 작성된 언어의 경우 특히 어렵습니다.한국어와 같은 통합 언어도 토큰화 작업을 복잡하게 만듭니다.

더 어려운 문제를 해결하는 몇 가지 방법에는 더 복잡한 휴리스틱 개발, 일반적인 특수 사례 테이블 쿼리, 또는 이후 처리 단계에서 콜로케이션을 식별하는 언어 모델에 토큰을 맞추는 것이 포함됩니다.

렉서 생성기

렉서는 파서 생성기와 유사한 렉서 생성기에 의해 생성되는 경우가 많으며, 이러한 도구는 종종 함께 제공됩니다.가장 잘 확립된 은 yacparser 제너레이터와 쌍을 이루는 lex이거나 플렉스(종종 GNU 바이슨과 쌍을 이루는)와 같은 수많은 재구현 중 일부입니다.이러한 생성기는 도메인별 언어의 한 형태로, 일반적으로 일부 마크업이 있는 정규 표현식인 어휘 사양을 사용하고 어휘를 내보냅니다.

이러한 도구는 매우 빠른 개발 속도를 제공하며, 이는 초기 개발에서 매우 중요합니다. 이는 작동하는 어휘 사용자를 확보하는 것과 언어 사양이 자주 변경될 수 있기 때문입니다.또한 손으로 프로그래밍하기 어려운 사전 및 사후 조건과 같은 고급 기능을 제공하는 경우가 많습니다.그러나 자동으로 생성된 어휘는 유연성이 부족할 수 있으므로 일부 수동 수정 또는 전체 수동으로 작성된 어휘가 필요할 수 있습니다.

렉서 성능이 중요한 문제이며, 최적화는 렉서가 매우 자주 실행되는 안정적인 언어(예: C 또는 HTML)에서 더욱 중요합니다. 렉서/플렉스 생성 렉서는 상당히 빠르지만 조정된 생성기를 사용하여 2-3배 향상이 가능합니다.손으로 쓴 어휘기가 사용되기도 하지만, 현대의 어휘기 생성기는 대부분의 손으로 코딩된 어휘기보다 더 빠른 어휘기를 생성합니다.생성기의 lex/Flex 제품군은 직접 코딩된 [dubious ]접근 방식보다 훨씬 덜 효율적인 테이블 기반 접근 방식을 사용합니다.후자의 접근 방식에서 제너레이터는 이동 명령문을 통해 직접 후속 조치 상태로 점프하는 엔진을 생성합니다.re2c[5] 같은 도구는 플렉스 생산 엔진보다 2~[citation needed]3배 빠른 엔진을 생산하는 것으로 입증되었습니다.일반적으로 후자의 도구에 의해 생성된 엔진보다 성능이 우수한 분석기를 손으로 작성하는 것은 어렵습니다.

구 구조

어휘 분석은 주로 문자의 입력 스트림을 토큰으로 분할하여 문자를 조각으로 그룹화하고 분류합니다.그러나 어휘 사용은 훨씬 더 복잡할 수 있습니다. 가장 단순하게, 어휘 사용자는 토큰을 생략하거나 추가된 토큰을 삽입할 수 있습니다.토큰, 특히 공백 및 주석을 생략하는 것은 컴파일러에 필요하지 않을 때 매우 일반적입니다.추가된 토큰이 삽입되는 경우는 거의 없습니다.이 작업은 주로 토큰을 구문 분석기로 그룹화하거나 구문 분석기를 단순화하기 위해 수행됩니다.

회선 연속

연속은 일반적으로 새 줄이 문 종료자인 일부 언어의 기능입니다.대부분의 경우, 줄을 백슬래시(바로 뒤에 새 이 표시됨)로 종료하면 줄이 계속됩니다. 다음 줄은 이전 줄에 연결됩니다.이 작업은 일반적으로 렉서에서 수행됩니다. 새 줄이 토큰화되는 대신 백슬래시 및 새 줄이 폐기됩니다.예를 들어 bash,[6] 기타 셸 스크립트 및 [7]Python이 있습니다.

세미콜론 삽입

많은 언어에서 세미콜론을 문 종료자로 사용합니다.대부분 필수 사항이지만 일부 언어에서는 세미콜론이 여러 상황에서 선택 사항입니다.이 작업은 주로 렉서 수준에서 수행되며, 렉서는 입력 문자 스트림에 없는 토큰 스트림에 세미콜론을 출력하며 세미콜론 삽입 또는 자동 세미콜론 삽입이라고 합니다.이러한 경우 세미콜론은 언어의 공식 구문 문법의 일부이지만 어휘 사용자가 삽입할 수 있기 때문에 입력 텍스트에서 찾을 수 없습니다.선택적 세미콜론 또는 다른 종결자 또는 구분자도 파서 수준에서 처리되는 경우가 있으며, 특히 쉼표 또는 세미콜론 에 오는 경우가 많습니다.

세미콜론 삽입은 [9]B나 C에는 없지만 BCPL과 그 먼 후손 [8]Go의 특징입니다.자바스크립트에는 세미콜론 삽입이 존재하지만 규칙이 다소 복잡하고 많은 비판을 받고 있습니다. 버그를 피하기 위해 일부는 항상 세미콜론을 사용할 것을 권장하는 반면 다른 일부는 잠재적으로 모호한 문의 시작 부분에 방어 세미콜론이라고 불리는 초기 세미콜론을 사용합니다.

세미콜론 삽입(세미콜론 종료 스테이트먼트가 있는 언어)과 줄 연속(새 줄 종료 스테이트먼트가 있는 언어)은 상호 보완적으로 보일 수 있습니다. 새 줄이 토큰을 생성하지 않더라도 세미콜론 삽입은 토큰을 추가합니다.일반적으로 새 줄이 토큰을 생성하지만,

오프사이드 규칙

오프사이드 규칙( 들여쓰기로 결정된 블록)은 Python에서와 같이 렉서에서 구현될 수 있습니다. 여기서 들여쓰기를 늘리면 렉서가 들여쓰기 토큰을 내보내고 들여쓰기를 줄이면 렉서가 하나 이상의 DEDENT [10]토큰을 내보냅니다.이 토큰은 오프닝 브레이스에 해당합니다.{및 클로징 브레이스}블록에 중괄호를 사용하는 언어에서, 구문 문법이 중괄호 또는 들여쓰기 사용 여부에 의존하지 않음을 의미합니다.이를 위해서는 어휘 보유 상태, 즉 들여쓰기 수준의 스택이 필요하므로 들여쓰기의 변화를 감지할 수 있으므로 어휘 문법은 문맥이 자유롭지 않습니다. ENTD-DEDENT는 이전 들여쓰기 수준의 상황별 정보에 따라 달라집니다.

상황에 맞는 어휘 사용

일반적으로 어휘 문법은 문맥에 구애받지 않으며, 따라서 단순하고 깨끗하고 효율적인 구현을 가능하게 하는 과거나 미래를 돌아보거나 역추적이 필요하지 않습니다.또한 이를 통해 렉서로 정보를 다시 전달할 필요 없이 렉서에서 파서로 간단한 단방향 통신이 가능합니다.

하지만 예외도 있습니다.간단한 예로는 바둑의 세미콜론 삽입, 파이썬의 연속 문자열 리터럴 연결, 다음 토큰이 다른 문자열 리터럴인지 확인하기 위해 버퍼에 하나의 토큰을 유지해야 하는 [7], 파이썬의 오프사이드 규칙 등이 있다,들여쓰기 수준의 개수를 유지해야 합니다(따라서 각 들여쓰기 수준의 스택).이러한 예제는 모두 어휘적 맥락만 필요로 하며, 어휘를 다소 복잡하게 만들지만 파서 및 이후 단계에서는 보이지 않습니다.

더 복잡한 예는 C의 렉서 해킹인데, 여기서 의미 분석 단계까지는 일련의 문자의 토큰 클래스를 결정할 수 없습니다. 왜냐하면 유형 정의 이름과 변수 이름이 어휘적으로 동일하지만 서로 다른 토큰 클래스를 구성하기 때문입니다.따라서 해커는 의미 분석기(예: 기호 테이블)를 호출하고 시퀀스에 typedef 이름이 필요한지 확인합니다.이 경우 정보는 파서뿐만 아니라 의미 분석기에서 다시 렉서로 흘러야 하므로 설계가 복잡해집니다.

참고 항목

레퍼런스

  1. ^ "Anatomy of a Compiler and The Tokenizer". www.cs.man.ac.uk.
  2. ^ https://stackoverflow.com/questions/14954721/what-is-the-difference-between-token-and-lexeme 에서 인용한 아호, 람, 세티, 울만의 "컴파일러 원리, 기술, 도구, 2판"(월드캣) 111페이지
  3. ^ "Structure and Interpretation of Computer Programs". mitpress.mit.edu. Archived from the original on 2012-10-30. Retrieved 2009-03-07.
  4. ^ Huang, C., Simon, P., Shieh, S., & Prevot, L. (2007) 중국어 단어 세분화를 다시 생각하는 중: 토큰화, 문자 분류 또는 단어 구분 식별
  5. ^ Bumbulis, P.; Cowan, D. D. (Mar–Dec 1993). "RE2C: A more versatile scanner generator". ACM Letters on Programming Languages and Systems. 2 (1–4): 70–84. doi:10.1145/176454.176487. S2CID 14814637.
  6. ^ Bash 참조 매뉴얼, 3.1.2.1 이스케이프 문자
  7. ^ a b "3.6.4 Documentation". docs.python.org.
  8. ^ 효과적인 바둑, "세미콜론"
  9. ^ "세미콜론 인 고", 골랑 너트, 롭 '사령관' 파이크, 2009년 12월 10일
  10. ^ "Lexical analysis > Indentation". The Python Language Reference. Retrieved 21 June 2023.

원천

  • C#과 Java로 컴파일, Pat Terry, 2005, ISBN 032126360X
  • 알고리즘 + 데이터 구조 = 프로그램, Niklaus Wirth, 1975, ISBN 0-13-022418-9
  • 컴파일러 구성, Niklaus Wirth, 1996, ISBN 0-201-40353-6
  • 세베스타, R. W. (2006).프로그래밍 언어의 개념 (제7판) 177페이지. 보스턴: 피어슨/애디슨-웨슬리

외부 링크