C 언어로 eval 바람 함수

6346 단어 Ceval

소개


eval 함수는 문자열을 표현식으로 평가하는 함수입니다. eval는 C 언어와 같은 컴파일러 언어에는 거의 없지만 JavaScript와 같은 인터프리터 언어에서 일반적입니다. 여기에서는 C 언어의 문자열을 수식으로 처리하는 eval 바람 함수를 만듭니다. 소스 코드는 GitHub에 있습니다.

주요 사양


eval는 인수의 수식을 계산하고 결과를 반환 값으로 사용하는 함수로 만듭니다. eval에서는 sin , exp , sqrt 등의 math.h 에 있는 함수를 사용할 수 있도록 합니다. 함수를 포함한 수식의 계산 순서는 다음과 같습니다. 계산 과정은 모두 문자열로서 처리를 실시합니다.
  • 함수: sin , exp , sqrt
  • 괄호: ( , )
  • 승법, 제법: * , \
  • 가법, 감법: + , -

  • 함수 계산 calcfunc, 사칙 연산 calc을 만듭니다. 괄호를 처리하려면 eval를 사용합니다. 프로그램의 의사 코드(?)와 함께 설명합니다. 실제 소스 코드는 길기 때문에 GitHub을 참조하십시오. 구현은 기본적으로 간단하며 위의 글머리 기호의 순서대로 계산하기만 하면 됩니다.
    double eval(char *str) {
        for ( 文字列先頭からループ ) {
            if ( 関数があった時 ) {
                str2 = 関数とその引数;
                str3 = num2str(calcfunc(str2));
                str = str2  str3 に置換;
            }
        }
        for ( 文字列先頭からループ ) {
            if ( 括弧があった時 ) {
                str2 = 括弧内の文字列;
                str3 = num2str(eval(str2));
                str = (str2)  str3 に置換;
            }
        }
        for ( 文字列先頭からループ ) {
            if ( *, / があった時 ) {
                str2 = 計算範囲;
                str3 = num2str(calc(str2));
                str = str2  str3 に置換;
            }
        }
        for ( 文字列先頭からループ ) {
            if ( +, - があった時 ) {
                str2 = 計算範囲;
                str3 = num2str(calc(str2));
                str = str2  str3 に置換;
            }
        }
        return atof(str);
    }
    

    처리 흐름의 예



    인수에 3*sqrt(4)+(5-2)로 했을 때를 예로 해 설명합니다. 우선 편리함을 위해 전체에 ( , )를 붙입니다.



    그런 다음 계산 순서대로 함수를 호출하여 계산합니다.



    다음으로 * , \ 에 의한 계산은 calc 를 이용해 실시합니다. 마지막으로 + , - 에 의한 계산을 실시합니다. 최종적으로 남은 값을 실수치로서 return 합니다.

    정리・향후



    C 언어에 대한 eval 바람 함수를 만들었습니다. calc 같은 함수에 대해 언급하지 않았지만 설명을 추가 할 수 있습니다. 꼭 구문 분석 등의 공부에 도움이 된다고 생각합니다. 향후의 과제로서 메모리를 많이 사용하는 처리 속도가 느린 등을 들 수 있으므로 개선하고 싶습니다. 또한 버그가 있을 수도 있습니다.

    문헌


  • 소스 코드 (GitHub)
  • 좋은 웹페이지 즐겨찾기