구문 분석 명령을 구문 분석기에 작성해야합니다. 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")
이 좋은 방법입니다 : 여기
내 생각? 이 문제에 대한 표준 접근 방식은 무엇입니까? 대신 파견해야합니까?개체와 관련된 유형을 확인하는 기능이 있습니다. 예를 들어, 위의 a
은 INT
유형이며 INT
값을 할당해야합니다. 그렇지 않으면 파서가 일종의 오류를 반환하거나 throw해야합니다. 또한 문자열에서 원하는 형식으로 값을 변환하기위한 변환 함수가 있습니다. 변환이 불가능한 경우에 throw됩니다. 구문 분석기가 문자열에서 값을 필수 유형으로 변환하려고하면 boost :: variant를 통해 문자열을 반환하는 것이 좋습니다.
답장을 보내 주셔서 감사합니다. AST를 반환하는 파서는 boost :: signals를 내보내는 이벤트 기반 파서를 구현하는 것보다 나은 옵션이라고 생각합니다. 이것은 파서의 인스턴스를 생성 할 때마다 파서에 대한 모든 리스너를 추가해야하기 때문입니다. 동의하니? – Baz
Boost에 익숙하지 않지만 일반적으로 파서 액션 코드를 사용하여 AST를 작성하면 일반적으로 구문 분석을하지 않는 한 즉각적인 조치를 취하는 대신 AST를 사용하는 것이 효과적입니다. – ebohlman