2012-09-19 2 views
0

구문 분석 명령을 구문 분석기에 작성해야합니다. 5 명령은 다음과 같습니다.명령 구문 분석기의 반환 세트

"a=10" 
"b=foo" 
"c=10,10" 
"clear d" 
"c push_back 2" 

첫 번째 예의 경우 set은 명령이고, a는 개체이며 10은 값입니다.

파서가 위의 각 줄마다 무엇을 반환해야한다고 생각합니까?

"a=10" -> SET (COMMAND_ENUM), INT (VALUE_TYPE), "a", ("10") 
    "b=foo" -> SET (COMMAND_ENUM), STRING (VALUE_TYPE), "b", ("foo") 

이 좋은 방법입니다 : 여기

내 생각? 이 문제에 대한 표준 접근 방식은 무엇입니까? 대신 파견해야합니까?

개체와 관련된 유형을 확인하는 기능이 있습니다. 예를 들어, 위의 aINT 유형이며 INT 값을 할당해야합니다. 그렇지 않으면 파서가 일종의 오류를 반환하거나 throw해야합니다. 또한 문자열에서 원하는 형식으로 값을 변환하기위한 변환 함수가 있습니다. 변환이 불가능한 경우에 throw됩니다. 구문 분석기가 문자열에서 값을 필수 유형으로 변환하려고하면 boost :: variant를 통해 문자열을 반환하는 것이 좋습니다.

답변

1

당신이 알아야 할 명령 언어에 대해 최소한 준 공식적 문법을 생각해 내야합니다. 왜냐하면 많은 것들이 실제로는 모호하게 지정 되었기 때문입니다 (예 : b=foo에서 b이 변수가되기를 원합니다. 이름이지만 foo은 문자열 리터럴이어야합니다. 어떻게 구별합니까? 문자 시퀀스는 할당의 오른쪽에있는 경우 식별자를 나타내지 만 왼쪽에있는 경우 리터럴을 나타내는가? 아니면 하나의 문자가 나타내는가? 식별자이지만 여러 문자가 리터럴을 나타냅니다?) c=10,10에서 10,10은 목록 또는 벡터를 나타 냅니까? 문법을 작성하는 것은 최소한 당신이 그런 것들에 대해 생각하도록 강요 할 것이고, 적어도 파서를 작성하는 방법에 대한 지침으로도 쓰일 것입니다 (대부분 파서로 자동 번역 될 수있는 것입니다).

구문을 추상 구문 트리 (AST)로 표현하는 방법을 생각해 보면 올바른 길을 걷고 있지만 구체적인 구문에 관해서는 한 걸음 뒤로 물러나서 살펴볼 필요가 있습니다.

+0

답장을 보내 주셔서 감사합니다. AST를 반환하는 파서는 boost :: signals를 내보내는 이벤트 기반 파서를 구현하는 것보다 나은 옵션이라고 생각합니다. 이것은 파서의 인스턴스를 생성 할 때마다 파서에 대한 모든 리스너를 추가해야하기 때문입니다. 동의하니? – Baz

+0

Boost에 익숙하지 않지만 일반적으로 파서 액션 코드를 사용하여 AST를 작성하면 일반적으로 구문 분석을하지 않는 한 즉각적인 조치를 취하는 대신 AST를 사용하는 것이 효과적입니다. – ebohlman