수학식 구문해석(Mathematical Expressions Parser)

수학식 구문해석이란 예를 들어 쉽게 말해, “cos(0)+45″와 같은 수학식을 문자열 그대로 입력하면 컴퓨터가 이 구문을 해석하여 계산하고 계산결과를 반환하는 것이다.

필요에 의해 쓸만한 수학구문해석 소스를 검색해 본결과 다음 사이트에서 제공하는 Fast mathematical expressions parser 클래스가 가장 쓸만했다.

http://www.codeproject.com/cpp/FastMathParser.asp

예제를 분석해 보면 그 사용법을 금방 알 수 있겠지만, 나름대로 필요한 내용만을 빼내어 쉽게 정리하고자 한다. 혹, 다른 이에 급하게 수학식을 해석해야하는 기능을 구현하고자 할때, 이 글이 손쉬운 길잡이 되었으면 하는 바램이다.

먼저 위의 링크를 통해서 소스코드를 다운로드 받고 ParserLib 폴더의 muParser.sln 솔루션을 열어 컴파일 한다. 라이브러리를 Static이 아닌 DLL로 사용하고 싶다면 ParserDLL 폴더의 muParserDLL.sln를 열어 컴파일 하면 되겠지만, 여기서는 Static을 이용하였다. 별 어려움 없이 쉽게 컴파일 할 수 있을 것이다.

이제 컴파일된 라이브러리를 사용하기 위해 새로운 프로젝트(콘솔이든, MFC 든 상관없으며, 여기서는 콘솔로 하였다) 시작하고 추가 포함 디렉토리와 추가 라이브러리 디렉토리로 바로 전에 컴파일 했단 ParserLib 폴더를 잡아주고 추가종속성에 muParserDbg.lib를 입력한다. 이 경우는 Debug의 경우이고 Release의 경우는 muParser.lib를 입력한다.

여기서 정리할 내용은 간단히 주어진 수학식을 계산하여 계산 결과를 얻어 내는 것이다.

#include "muParser.h"
#include 

using namespace std;

int main() {
    char line[100];
    mu::Parser  parser;

    cin >> line;

    try {
        parser.SetExpr(line);
        cout << "결과: " << parser.Eval() << endl;
    } catch(mu::Parser::exception_type &e) {
        cout << "Msg: " << e.GetMsg() << endl;
    }
}

핵심이 되는 클래스는 mu 네임스페이스에 있는 Parser이고 수학식을 Parser의 SetExpr 맴버함수를 통해 전달해 주고, Eval 맴버함수를 통해 결과를 얻는다. Eval 맴버 함수는 옳바르지 않은 수학식일 경우 exception_type 예외를 발생하므로, 이 예외를 잡아 처리해 주면 된다.

사용할 수 있는 수식은 아래 두 표를 참고하기 바란다. 거의 대부분의 수학식과 이진연산식을 사용할 수 있으며, 개발자가 원하는 식을 직접 구현해 넣을 수 있다.

간단히 쓸만한 수학식 구문해석 클래스에 대해서 살펴보았고, 더 자세한 것에 대해서는 직접 다운로드 받은 예제를 통해 분석해보시길 바랍니다... 분명히 Fast mathematical expressions parser 라이브러리는 많은 사람들의 좋은 평가만큼이나 쓸만한 라이브러리가 틀림없습니다.