C언어에서 eval 형태 사용하기..
글쓴이: 매그넘 / 작성시간: 화, 2007/02/13 - 10:16오후
제목을.적당하게 달았는지.. 저도 의심스럽습니다. ㅡㅡ; 질문할 내용이
딱히 제목을..뽑기가 어려워서 말이죠...^^
자~ 질문 들어갑니다.!!
C언어에서
int value[] = { 2, 500};
char *str = "$0 * 304 > $1"
저런 형태의 변수가 있습니다.
제가 궁금한것은
str 문자열에서... $0 을 value[0]으로 대치하고 $1 을 value[1]으로 대치한다음에..
식이 참인지 거짓인지 판단하는 방법이..알고 싶습니다.
각 변수를 대입하면
"2 * 304 > 500"
로 되는데.. 위의 문자열을 일반적인 수식으로 생각을 했을때... 참인지 거짓인지 여부를 알아내는 방법이 있을까요?
그리고 이러한 기능도 어떠게 구현을 해야할지.궁금하네요.
char * str = "double($0) > $1";
역시나 $0, $1 에 각각의 값들을 세팅을 하고, int double(int) 이란 함수가 있는상태에서.. double($0) 을 수행한다음에
$1 이랑 비교연산을..해야하는데.. 어떻게 해야할지.. 막막하네요..
고수님들!! 조그마한 힌트 부탁드리겠습니다!!!!
Forums:
제가 알기로 방법이 없습니다
또한 내용도없습니다
음. 앞의 일반 식을
음. 앞의 일반 식을 평가하는 건 파싱해서 처리하면.. 가능할 것 같습니다.
뒤의 함수 호출도.. double이라는 함수를 미리 등록해두었다면, 함수 포인터로 해결 가능하겠습니다. 만일 미리 등록해두지 않고, 런타임시에 결정되는 문자열이 함수로 존재하는 지는.. 모를 것 같습니다~
위의 두 경우 모두, 문자열을 파싱해서 적절하게 처리해줘야 합니다. 보통 eval이라고 하면, 그 언어의 표현식을 문자열로 받는 경우인데, C에서는 그런 식으로 처리를 할 수 없으니까요. eval이라기보다는, 언어 하나를 짜는 셈이 되겠군요;
넵,
네, lacovnk님 말씀대로 보통 다른 말하는 eval이라긴 좀 그렇죠..^^
그래서 방법이 없다구 했던거구요
스트링 리터럴의 부분 내용을 파 내구, 값을 넣구 그래서 expression을 하나 만들어 내구 그 다음에 값을 평가하는(그것도 런타임에)건 유용성도 잘 모르겠구..무엇보다 좀 이상해서요;;
스크립트 언어랑
스크립트 언어랑 연동해서 런타임중에 스크립트 언어를 불러다쓸수는 없나요?
간단히 C
간단히 C 인터프리터를 내장하면 되겠네요. (말만 간단하다는······.;;)
double 은 C keyword 라 안됩니다.
(^_^)...
어찌되었든 eval 함수를 만드시고 싶다는 거죠?
대충
bool eval(const char *ex, int value[]);
를 원하시는 것 같군요.
사용자정의함수를 적용할 수 있게 하려면
bool eval(const char *ex, int value[], const char *fn[], int f[](int))
정도가 될텐데 아무리 생각해도 이건 좀 over 군요.
C 언어 코드가 미리
C 언어 코드가 미리 기계어로 컴파일되어 실행되는 방식이라는 점을 생각해보면 eval처럼 런타임 중에 임의의 코드를 평가하는 기능은 C 언어의 근본적인 구조상 불가능합니다.
저 상황에서 할 수 있는 가장 간단한 방법은 문자열로 주어진 수식을 해석하여 평가하는 수식 평가기 (evaluator)를 따로 작성하여 내장하는 방식일 듯 합니다.
----
mono* in the swirl
----
http://www.planetmono.org
궤변입니다만..
정보 올림피아드에서 저런 문제가 나온 적이 있습니다. 별써 수년 전인데 왠지 정겹군요.
그때 expression을 소스 코드에 박는 프로그램을 만든 다음에 명령행으로 터보씨 컴파일러를 실행하여 결과를 냈습니다.
치명적인 약점은 터보씨가 있어야 한다는 것이죠.. -,.-
암튼, 위엣 분들이 답변하셨듯이 외부 스크립트와 붙이면 간단하겠네요.
댓글 달기