2014-04-17 2 views
1

주어진 문법에 대한 렉서 (lexer)와 파서 (parser)를 작성해야합니다 (생성자가 아닌 수공예품이 필요합니다). 나는 많은 연구를 해왔지만 여전히 코드를 작성하는 방법을 알 수 없다. 예를 들어EBNF에서 C++의 Lexer 및 파서

나는 (문법 EBNF에)있다 :

<Letter> ::= [A-Za-z] 

<IntegerLiteral> ::=<Digit> { <Digit> } 

이 필요 렉서 또는 파서 정의 할 수 있습니까? 그리고 어떻게?

나는 렉서가 문자와 출력 토큰으로 파일 문자를 읽어야한다는 것을 알고있다. 그런 다음이 토큰은 파서 트리를 만들기 위해 파서로 전달되지만 코딩에 갇혀있다.

+0

"발전기가 아닌 공예품을 만들어야합니다."그게 부스트 정신을 사용하지 못하게합니까? (www.boost.org). – Bathsheba

+0

은 발전기입니까? – user3505334

+0

_ '이것은 생성기입니까?'라는 의미에서 C++ 컴파일러 이외의 것이 사용되어야합니다. –

답변

2

토큰 유형을 정의하는 것처럼 보입니다. 그래서 그것은 렉서에 들어갑니다.

렉서 작성의 트릭은 입력 텍스트 (단순히 개별 문자의 긴 스트림)를 하나씩 가져 와서 하나씩 살펴 보는 것입니다. 캐릭터를 볼 때마다 위의 EBNF (즉, 문자 또는 IntegerLiteral)에 따라 문자를 분류 한 다음 적절한 토큰을 생성합니다.

위의 문법은 꽤 무의미한 것 같습니다 (단일 문자 및 한자리 숫자 토큰을 생성합니다). 그래서이 규칙을 사용하여 정의를보다 쉽게 ​​읽을 수있는 규칙이 더 많습니다. 따라서 더 복잡한 규칙을 구현하십시오. 문자가 하위 규칙 중 하나와 일치하는지 여부를 감지하는 함수를 작성하십시오.

현재 문자가 이전 문자 유형과 일치하지 않을 때마다 현재 문자를 완료하고 새 문자를 시작하십시오.

거의 모든 것이 있습니다. 유형을 추적하기 위해서는 많은 수의 불리언이 필요합니다.

+0

이 작업을 수행하는 방법을 설명하는 사이트가 있습니까? 왜 유형을 추적하기 위해 부울을 사용해야합니까? Ans yes 나는 2 개의 간단한 것을 작성한보다 복잡한 규칙을 가지고있다. 또한 어떻게 당신은 위의 EBNF로 캐릭터를 분류 할 수 있습니까? – user3505334

+0

부울은 켜거나 꺼지는 항목을 기억하기 위해 사용되는 가장 단순한 유형이므로 (즉, 정수 또는 이중 일 수있는 정수에 정수가 있지만 마침표가 발생하여 이제는 소수 일 수 있습니다. , 등). 당신은 또한 본격적인 상태 머신으로 그것을 구현할 수 있지만, "상태 머신"이라는 단어를 언급 할 때마다 사람들은 두려움에 빠지기 때문에 설명에서 제외한다고 생각했습니다. – uliwitness

관련 문제