2013-03-08 1 views
1

Command-line-tool을 빌드 할 것입니다. 사용자 유형에 텍스트/문자열 (함수/명령)을 입력하고 싶습니다. 그러면 My tool은이 문자열을 C++ 함수/변수로 변환합니다.입력 문자열을 function으로 변환하는 방법()

[그들은 내 사용자 정의 데이터 형, 내 자신의 기능을 실행, 실행되지 시스템 기능]

예 : 사용자 유형

>> myVar = c(123,456,789) 

내 도구 myVar 변수 이름임을 알 수 . c(123,456,789)integer의 배열입니다.

입력 :

>> myPrintf(myVar[0]); 

출력

<< 123 

int myVar[] = {123,456,789}; 

및 사용자가 너무 함수를 호출 할 수 있습니다 : 그리고 그것은이 같은으로 이러한 문자열 변환

그리고 내 솔루션 : 나는 클래스를, 부일 것이다 어쩌면이 같은 :

public class cVariable 
{ 
    public string varName; // the variable name 
    private varType; // the variable data-type 
    public string varData; // the value of this variable 
} 

그리고 내가 실행해야하는 데이터 형/기능을 알고 if/else 문을 사용합니다.

하지만이 방법이 전혀 좋지 않다고 생각합니다.

+1

컴파일러를 빌드하려고합니다. 행운을 빕니다. – SLaks

+0

LLVM 사용을 고려하십시오. – SLaks

+0

당신의 유일한 실제 질문은 "입력 문자열을 function()으로 변환하는 방법"이라는 제목 인 것 같습니다. 'boost :: spirit' 라이브러리를 사용하는 것이 좋습니다. 배우는 것이 어려울 지 모르지만, 일단 이해하면 프로그램을 더 쉽고 빠르게 향상시킬 수 있습니다. 빠른 시작을 원한다면, 정규 표현식을 사용하면 대입 함수 대 함수 호출, 인수 값 추출 등을 도울 수 있습니다. 더 기본 적으로'sscanf()'를 사용할 수 있습니다. "나는이 방법이 전혀 좋지 않다고 생각한다"- 사람들이 논평 할 수있는 당신의 우려를 설명한다면. 가장 명백한 코멘트는 ruby ​​/ perl/etc를 사용하라. –

답변

3

요약 : 이것은 아마도 보이는 것보다 더 힘들 것입니다. 소규모 사례가 있고 오늘 밤 일할 수있는 무언가를 원한다면 (그리고 이것은 주로 학습 활동입니다), 당신은 첫 번째 접근법을 따라갈 수 있습니다.

맞춤식 언어를 만들고 해당 언어를 해석하고 컴파일 된 이진 파일에 바인딩하려는 것처럼 들리는 까닭이 궁금합니다. 일반적으로 이는 엄청난 사업입니다. 범위를 좁히면 더 나은 답변이나 결과를 얻을 수 있습니다.

사용자가 다음 내용을 숙지 경우 얼마나 많은 옵션입니다 가능한 당신의 생각해야합니다 :

    • 동적 링크를 연결 컴파일 &
  • 반사
  • 스크립팅 및 해석 언어 프로그램 자체의 구조에 대한 지식을 가지고 언어를 식별자를 들어 언어 바인딩
  • 코드 생성
    • 은 반사라는 기능이 필요합니다. 표준 C++에는이 기능이 없습니다 (다른 많은 기능도 포함). 코드가 컴파일 될 즈음에는 더 이상 함수, 유형 또는 인수에 대한 문자열 식별자가 없습니다.

      가에 반사와 같은 행동의 토론을위한 다음과 같은 질문을 참조 C/C++ : How can I add reflection to a C++ application?

      (동적 링크에 대한 규칙이 존재 바이너리 컴파일의 위치에 문자열에서 매핑을 제공하는 C 및 C++하지만, 이것은 아마도 당신이 원하는 것을 성취하는 가장 직접적인 방법이 아닐 것입니다.)

      원본 소스 코드에 바인딩되어있는 해석 된 언어를 빌드하는 것이 좋습니다. 매우 고립 된 사례가있는 경우 전처리 장치 트릭 사용을 고려할 수 있습니다. (위의 링크 된 질문은 Qt가 구현 한 부스트 도구와 부스트 도구를 참조합니다.)

      기존 스크립팅 언어를 사용할 수 있다면이 언어에서 C++ 코드에 대한 바인딩 생성을 조사 할 수 있습니다. 다음은 파이썬을위한 몇 가지 리소스입니다 : http://wiki.python.org/moin/IntegratingPythonWithOtherLanguages.

      int (*p)(char*,...) = printf; 
      

      가 함수 포인터를 사용

      는 값에 따라 기능을 지정 : 제목 "(함수에 문자열을 변환)"당신은 함수 포인터에이를 수있는 경우와

    +0

    키워드 주셔서 감사합니다. 정말 도움이됩니다. 나는 Reflection, Dynamic Linking에 대해 많이 모른다 ... 나는 지금 그들에 대해 연구해야한다고 생각한다. 감사 – hungdoan

    2

    비교적 완성도 높은 무언가를 실제로하려는 경우 자신의 언어를 쓰는 것은 상당한 작업입니다. 수천 줄의 코드가 가능합니다. 필자는 디버거에서 명령어를위한 간단한 파서를 작성하거나 상당히 잘 작동하는 "미니 베이직"인터프리터와 작은 Lisp 인터프리터와 비슷한 30 년의 전문적이고 취미 생활을 통해 다양한 형태로이 작업에 참여해 왔습니다. 또한 텍스트 파일을 프로그램의 입력으로 사용하는 많은 "의사 언어"를 만들었지 만 본격적인 프로그래밍 언어는 아니며 제한된 변수 만 있습니다.

    내가 한 일 중 하나는 실제 "코드"가 테이블 형태로 프로그램에 내장 된 "테이블 중심 프로그래밍"입니다.

    이 모든 경우에는 "다른 개체와 관련하여 작업으로 변환하려는 일부 입력/데이터가 있습니다"라는 다양한 형식이 있습니다.

    기본 메커니즘은 이름과 기타 데이터 (예 : 유형)를 일종의 데이터 구조에 저장하는 것입니다. std::map<std::string, cVariable>은 이름 (문자열)에서 해당 이름의 변수로 데이터를 비교적 쉽게 검색 할 수있는 한 방법입니다.

    분명히 기능에 대해 동일한 작업을 수행 할 수 있습니다. 물론 함수에 인수를 전달할 수있는 방법이 있습니다. 정확히 당신이 그것을 해결하는 방법은 모든 언어가 해결해야만하는 것이고, 보통 어떤 종류의 "스택"이 될 수 있습니다.

    이름에서 함수로 변환되는 map<std::string, function>을 확실히 가질 수 있습니다. 함수 정의에는 함수가 취하는 인수의 수와 유형에 대한 정보가 포함될 수 있습니다.

    "내장"함수의

    , 당신은 또한 인수 cVariable로 전달됩니다 argc, argv[] 형 접근 방식의 유형을 가질 수 사실이 아니다 물론, 이는 myPrint(myVar[0] + 100) 수 있도록, [하나의 옵션은 constant 또는 expression입니다] 변수이지만 변수의 내용이 상수에 추가 된 결과입니다.

    변수가있는 계산기처럼 작동하는 것을 작성하지 않았다면, 이는 좋은 출발점이 될 것입니다.

    많은 "스크립트"유형 언어에는 "다형성"인 변수가 있습니다. 즉, 변수를 실제로 변환하지 않고 숫자 또는 문자열로 사용할 수 있습니다.

    0

    먼저 귀하의 의견과 무엇을 것입니다 정의 된 규칙를 결정 주문에 따라 구문 분석 어휘 analisis을 할 필요가

    char* str = "hello function pointer"; 
    p("say %s", str); 
    

    그러나 이것은 문제의 절반 : 함수를 호출 DIGIT, BRACKETS, ASSIGNMENTS 등과 같은 토큰 (명령 행 도구의 언어를 구성하는 기호). 그런 다음 명령에서 구문의 의미에 대한 규칙을 설정하는 구문 분석기가 필요합니다. 이것은 기본적으로 상태 시스템으로 수행되지만 복잡한 작업이므로 직접 구현하지 않으려한다고 생각합니까? 파서 생성을 자동화하려면 FlexBisson 도구를 살펴보십시오.

    이렇게하면 원하는 모든 언어를 해석하는 일반적인 명령 줄 도구에 대한 일반적인 해결책을 얻을 수 있습니다. 구문이 단순하지 않은 경우 파서를 직접 사용할 수도 있고 어쩌면 일부 정규식 라이브러리를 사용하여 수행 할 수도 있습니다.

    관련 문제