2012-07-10 5 views
1

웹 응용 프로그램에서 다음을 구현해야합니다. 내 솔루션이 잘못되었다는 것을 알고 있지만 코드 jsut을 사용하여 아이디어를 보여줍니다.호에 표현식을 할당하고 실행하십시오.

클래스 '호'가 있습니다. 이 호에 ANY 표현식을 지정할 수 있어야합니다 (예 : + b + c, a-c, if-then). 일단 표현식이 할당되면, 무작위로 추출한 변수로 표현식을 실행할 수 있기를 바랍니다. 웹 응용 프로그램에서 이러한 기능을 구현할 수 있습니까? 어쩌면 MathPL과 같은 플러그인을 사용해야할까요? 또는 그런 종류의 문제를 해결하기위한 절대적으로 다른 접근법이있을 수 있습니까?

class arc { 

    var $arcexpression; 

    function setExpression($arcexpression) { 
     $this->arcexpression = $arcexpression; 
    } 

    function getExpression() { 
     return $this->arcexpression; 
    } 


} 

$arc = new arc(); 

$arc->setExpression("if a>b then return a else return b"); 

$result = $arc->execute(a,b); // the function 'execute' should be somehow described in 'arc' 
+0

거기에 입력 된 내용을 신뢰할 수 있으면 PHP를 사용하고 '평가'하십시오. 그렇지 않으면 자신 만의 미니 언어와 파서를 만들어야 할 것입니다. – deceze

+0

미니 언어 및 파서를 작성하는 방법을 보여주는 자습서의 웹 링크를 제공 할 수 있습니까? –

+0

[이] (http://www.amazon.com/Language-Implementation-Patterns-Domain-Specific-Programming/dp/193435645X)는 언어 파서를 만드는 방법에 관한 아주 좋은 실용서입니다. –

답변

0

이 경우 전체 언어를 구현할 필요가 없습니다. 예를 들어 표현식을 산술 연산자 (+, -, *, /), 괄호 및 if-then 연산자로 제한하는 등의 작업을 제한하여 시작합니다. if-then을 사용하면 php의 연산자 인 ?:과 같은 식으로 구문을 강화해야합니다. 그 후에이 문법에 대해서만 파서를 만들 필요가 있습니다 : 주어진 표현식을 나무로 파싱합니다. 예를 들어, 표현식`a + b * c '는 다음과 같이 해석 할 수 있습니다.

+ 
/\ 
a * 
/\ 
    b c 

그런 식으로 계산하면됩니다. 예를 들어 배열 의 evaluate 함수에 배열을 전달하면 7을 얻을 수 있습니다. 그 위치에서 데이터를 분석 할 재귀 함수를 호출 - 문자열의 위치 1에서

  1. 시작 :

    해석의 아이디어는 다음과 같다. 함수에서 지정된 위치에서 읽기를 시작합니다.

  2. 당신이 여는 괄호를 읽는다면, 당신은 닫는 괄호 또는 끝 문자열을 발생하는 경우 재귀
  3. 는 (괄호 안에 반복적으로 또는)
  4. 읽기 최초의 식별자를 읽기 루트 노드
  5. 를 돌려 자신을 호출 산술 부호
  6. 는 제 2 식별자를 읽기 (또는 재귀 괄호 안에)
  7. 를 서명이 */또는, 다음에서 기호 노드를 생성하고 자식으로 두 개의 피연산자와 대응 방치 (노드를 연결 또는 오른쪽) 자식.
  8. 부호가 + 또는 - 인 경우 부호가있는 노드를 찾으십시오. 하위 노드 중 하나는 피연산자 중 하나이고 하위 노드의 루트는 루트에 * 및 /가 있습니다 (또는 두 번째 피연산자, 간단한 조작 인 경우).

괄호로 순수 산법을 얻는 것은 쉽습니다. if-then은 조금 까다 롭지 만 여전히 나쁘지는 않습니다. 약 10 년 전에 저는 자바에서 이런 것을 구현해야했습니다. 모든 것을 정렬 시키려면 약 3 일이 걸렸고 javadoc을 제외하고 한 줄에 약 500 줄의 코드가 합쳐졌습니다. 필자는 PHP에서 PHP 구문 및 형식 변환의 단순함으로 인해 코드가 적을 것으로 생각합니다.

복잡한 것처럼 들리 겠지만, 실제로는 시작한 것보다 훨씬 쉽습니다. 17-18 년 전에 알고리즘 수업의 일부로 비슷한 것을하기위한 대학 임무를 아주 잘 기억합니다.

관련 문제